1、scoped_array
专注于为中小企业提供网站设计、成都做网站服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业凌河免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千多家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。
是专门对数组空间进行管理的。包装了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算法,是纯粹的裸接口,不推荐使用。
文章题目:Boost库中scoped_array
链接分享:http://chengdu.cdxwcx.cn/article/ghspsh.html