您好,登錄后才能下訂單哦!
1、scoped_array
是專門對(duì)數(shù)組空間進(jìn)行管理的。包裝了new[]在堆上分配的動(dòng)態(tài)數(shù)組;
scoped_array彌補(bǔ)了標(biāo)準(zhǔn)庫(kù)中沒(méi)有指向數(shù)組的智能指針的缺憾。
2、此類特點(diǎn)如下:
(1)、構(gòu)造函數(shù)接受的指針p必須是new[]的結(jié)果,不能是new;
(2)、沒(méi)有*、->操作符的重載(庫(kù)中不提供這些的重載,但是我們可以自己寫),因?yàn)閟coped_array所持有的不是一個(gè)普通的指針;
(3)、析構(gòu)則必須用delete [];
(4)、提供operator[]的重載,可以像普通數(shù)組一樣進(jìn)行下標(biāo)訪問(wèn)元素;
(5)、沒(méi)有begin()、end()等類似容器的迭代器操作函數(shù);
scoped_array與scoped_ptr有相同的設(shè)計(jì)思想,也是局部智能指針,不能拷貝和賦值;
3、怎么使用scoped_array
#include<iostream> #include<boost/smart_ptr.hpp> //內(nèi)部實(shí)現(xiàn)好的,直接調(diào)用系統(tǒng)的。 using namespace std; using namespace boost; //這個(gè)命名空間必須要有。 int main(void){ int *p = new int[10]; //申請(qǐng)數(shù)組空間 scoped_array<int> ps(p); //交與智能指針管理 for(int i = 0; i < 10; i++){ ps[i] = i+1; //可以進(jìn)行下標(biāo)操作 } for(i = 0; i < 10; i++){ cout<<ps[i]<<" "; } cout<<endl; } //拷貝構(gòu)造和賦值都不可以。
4、scoped_array源碼的實(shí)現(xiàn)
#include<iostream> using namespace std; template<class T> class scoped_array{ public: explicit scoped_array(T *p = 0) : px(p){} //預(yù)防隱式調(diào)用 ~scoped_array(){ delete []px; } public: typedef scoped_array<T> this_type; void reset(T *p = 0){ //重置方法 this_type.swap(*this);//無(wú)名臨時(shí)對(duì)象 } void swap(scoped_array &b){ T *tmp = b.px; b.px = px; px = tmp; } T* get()const{ return px; } T& operator[](int i)const{ //下標(biāo)越界沒(méi)有檢測(cè) //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 &);//放到私有中,外界無(wú)法調(diào)用 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; //利用 + ,*的運(yùn)算符的重載即可以實(shí)現(xiàn)。 for(i = 0; i < 10; i++){ cout<<ps[i]<<" "; } cout<<endl; }
庫(kù)中沒(méi)有提供*和+的重載。
scoped_array缺點(diǎn):
不能動(dòng)態(tài)增長(zhǎng),沒(méi)有迭代器支持,不能搭配STL算法,是純粹的裸接口,不推薦使用。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。