Boost库中scoped_array-创新互联
1、scoped_array
10年积累的成都网站设计、网站制作、外贸营销网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有民丰免费网站建设让你可以放心的选择与我们合作。是专门对数组空间进行管理的。包装了new[]在堆上分配的动态数组;
scoped_array弥补了标准库中没有指向数组的智能指针的缺憾。
2、此类特点如下:
(1)、构造函数接受的指针p必须是new[]的结果,不能是new;
(2)、没有*、->操作符的重载(库中不提供这些的重载,但是我们可以自己写),因为scoped_array所持有的不是一个普通的指针;
(3)、析构则必须用delete [];
(4)、提供operator[]的重载,可以像普通数组一样进行下标访问元素;
(5)、没有begin()、end()等类似容器的迭代器操作函数;
scoped_array与scoped_ptr有相同的设计思想,也是局部智能指针,不能拷贝和赋值;
3、怎么使用scoped_array
#include#include //内部实现好的,直接调用系统的。 using namespace std; using namespace boost; //这个命名空间必须要有。 int main(void){ int *p = new int[10]; //申请数组空间 scoped_array ps(p); //交与智能指针管理 for(int i = 0; i < 10; i++){ ps[i] = i+1; //可以进行下标操作 } for(i = 0; i < 10; i++){ cout< 4、scoped_array源码的实现
#includeusing namespace std; template class scoped_array{ public: explicit scoped_array(T *p = 0) : px(p){} //预防隐式调用 ~scoped_array(){ delete []px; } public: typedef scoped_array this_type; void reset(T *p = 0){ //重置方法 this_type.swap(*this);//无名临时对象 } void swap(scoped_array &b){ T *tmp = b.px; b.px = px; px = tmp; } T* get()const{ return px; } T& operator[](int i)const{ //下标越界没有检测 //return *(px+i); return px[i]; } T& operator*()const{ return px[0]; } T* operator+(int i)const{ return px+i; } private: T *px; scoped_array(scoped_array const &);//放到私有中,外界无法调用 scoped_array& operator=(scoped_array const &); void operator==(scoped_array const &)const; void operator!=(scoped_array const &)const; }; int main(void){ int *p = new int[10]; scoped_array ps(p); *ps = 2; for(int i = 0; i < 10; i++){ ps[i] = i+1; } *(ps + 3) = 100; //利用 + ,*的运算符的重载即可以实现。 for(i = 0; i < 10; i++){ cout< 库中没有提供*和+的重载。
scoped_array缺点:
不能动态增长,没有迭代器支持,不能搭配STL算法,是纯粹的裸接口,不推荐使用。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
当前文章:Boost库中scoped_array-创新互联
标题网址:http://azwzsj.com/article/dgojpe.html