拷貝構造
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...