STL程式設計實踐三:剖析STL容器的複製構造和賦值特性 (轉)

worldblog發表於2007-12-11
STL程式設計實踐三:剖析STL容器的複製構造和賦值特性 (轉)[@more@]

 

STL設計實踐三:剖析STL容器的複製構造和賦值特性:namespace prefix = o ns = "urn:schemas--com::office" />

複製構造

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

class TestCpyConstruct

{

public:

TestCpyConstruct():data(NULL)

{

data = (char*) operator new(size);

memset(data,0,size);

}

~TestCpyConstruct()

{

operator delete(data);

}

private:

enum{size = 128};

char * data;

};

上面定義了一個TestCpyConstruct類,現在我們寫出一段如下的程式碼,定義一個向量來TestCpyConstruct物件。

void main()

{

vector vect;

TestCpyConstruct obj;

vect.push_back(obj);

}

當你編譯並執行時,會出錯,原因是訪問。從而我們可以肯定在STL的vector容器中使用瞭如下虛擬碼。

new (&memaddr) TestCpyConstruct(const TestCpyConstruct& );

其中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給我帶來極大的方便,但是在使用時一定要清楚其限制和內部原理,只有這樣才能寫出正確的程式,尤其是應用在自定義型別時。

好了先說到這吧,我知道的也不多。本文僅供參考。文章寫的倉促,有錯別字或錯誤請大家來信指出 to:ccplusplus@21cn.com">ccplusplus@21cn.com,先謝謝大家。歡迎和大家交流(--袁小凱--)。

附:

  1.如下的程式呼叫的是複製建構函式而不是賦值操作。

vector< TestCpyConstruct> vect1;

TestCpyConstruct obj;

vect.push_back(obj);

vector< TestCpyConstruct> vect2;

vect2 = vect1;

  2.TestCpyConstruct的複製建構函式原型應為

    TestCpyConstruct(const TestCpyConstruct&)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991368/,如需轉載,請註明出處,否則將追究法律責任。

相關文章