STL容器的拷貝構造和賦值特性

2021-04-12 13:39:15 字數 1541 閱讀 7276

拷貝構造

stl容器都支援元素的插入操作,但是當你插入自定義類物件你必須要清楚的了解stl容器是如何完成插入,對插入的自定義類物件有什麼基本的要求。否則會出現你想不到的錯誤。舉例說明。

class testcpyconstruct

~testcpyconstruct()

private:

enum;

char * data; };

上面定義了乙個testcpyconstruct類,現在我們寫出一段如下的**,定義乙個向量來儲存testcpyconstruct物件。

void main()

當你編譯並執行時,會出錯,原因是非法訪問。從而我們可以肯定在stl的vector容器中使用了如下偽**。

new (&memaddr)testcpyconstruct(consttestcpyconstruct&);

其中memaddr為容器動態分配的記憶體位址,該操作呼叫了

testcpyconstruct的拷貝建構函式。由於在testcpyconstruct類中我們沒有定義拷貝建構函式,所以呼叫了由編譯產生的預設拷貝建構函式,因此在程式析構testcpyconstruct物件和vector物件時發生了錯誤。

這說明在向容器中插入元素時呼叫了拷貝建構函式,所以在用容器儲存自定義型別時,沒有書寫正確的拷貝建構函式會出現錯誤。

賦值操作

在看了上面的說明後我們再看看容器的賦值操作,stl中容器都支援容器物件相互賦值。

vector< testcpyconstruct> vect1;

testcpyconstruct obj;

vect.push_back(obj);

vector< testcpyconstruct> vect2;

testcpyconstruct obj2;

vect2.push_back(obj2);

vect2 = vect1;

在這段**中同樣會出現上面的錯誤,因為stl的vector容器中在賦值操作中呼叫了自定義類的operator=函式,但由於沒有定義出,所以會出現錯誤。

綜上所述,stl給我帶來極大的方便,但是在使用時一定要清楚其限制和內部原理,只有這樣才能寫出正確的程式,尤其是應用在自定義型別時。

附:1.

如下的程式呼叫的是

拷貝建構函式而不是賦值操作。

vector< testcpyconstruct> vect1;

testcpyconstruct obj;

vect.push_back(obj);

vector< testcpyconstruct> vect2;

vect2 = vect1;

2.testcpyconstruct

的拷貝建構函式原型應為

testcpyconstruct(const testcpyconstruct&)

拷貝構造和拷貝賦值

注意指標型別成員變數的深拷貝問題 拷貝構造屬於定義,並賦值 拷貝賦值屬於已經定義,只是賦值。拷貝構造的深拷貝,因為如果提供了拷貝建構函式,則構造該物件時使用的是拷貝建構函式。在拷貝建構函式中只需要 分配新資源,拷貝新內容,返回自引用即可。但是在拷貝賦值函式中,如果存在指標成員變數一般在物件定義時已經...

STL容器與拷貝建構函式

所有容器提供的都是 value語意 而非 reference語意 容器內進行元素的安插操作時,內部實施的是拷貝操作,置於容器內。因此stl容器 的每乙個元素都必須能夠拷貝。以vector為例,往vector中 實際上所有stl容器都是這樣 放元素,vector會呼叫元素類的拷貝建構函式生成的副本,當...

拷貝建構函式和賦值構造

為什麼空類可以建立物件呢?複製建構函式的引數可以是 const 引用,也可以是非 const 引用。一般使用前者,這樣既能以常量物件 初始化後值不能改變的物件 作為引數,也能以非常量物件作為引數去初始化其他物件。乙個類中寫兩個複製建構函式,乙個的引數是 const 引用,另乙個的引數是非 const...