概述
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<iostream>
#include<boost/smart_ptr.hpp> //内部实现好的,直接调用系统的。
using namespace std;
using namespace boost; //这个命名空间必须要有。
int main(void){
int *p = new int[10]; //申请数组空间
scoped_array<int> ps(p); //交与智能指针管理
for(int i = 0; i < 10; i++){
ps[i] = i+1; //可以进行下标操作
}
for(i = 0; i < 10; i++){
cout<<ps[i]<<" ";
}
cout<<endl;
}
//拷贝构造和赋值都不可以。
4、scoped_array源码的实现
#include<iostream>
using namespace std;
template<class T>
class scoped_array{
public:
explicit scoped_array(T *p = 0) : px(p){} //预防隐式调用
~scoped_array(){
delete []px;
}
public:
typedef scoped_array<T> 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<int> 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<<ps[i]<<" ";
}
cout<<endl;
}
库中没有提供*和+的重载。
scoped_array缺点:
不能动态增长,没有迭代器支持,不能搭配STL算法,是纯粹的裸接口,不推荐使用。
转载于:https://blog.51cto.com/wait0804/1832027
最后
以上就是聪慧御姐为你收集整理的Boost库中scoped_array的全部内容,希望文章能够帮你解决Boost库中scoped_array所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复