STL程式設計實踐三:剖析STL容器的複製構造和賦值特性 (轉)
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
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- STL程式設計實踐二: 注意迭代子的失效 (轉)程式設計
- STL原始碼剖析——vector容器原始碼
- C++實踐:STL容器reserveC++
- 【STL 原始碼剖析】淺談 STL 迭代器與 traits 程式設計技法原始碼AI程式設計
- STL程式設計實踐五:巢狀式的型別宣告 (轉)程式設計巢狀型別
- STL程式設計實踐一:謹慎使用下標運算子 (轉)程式設計
- STL程式設計實踐四:簡化輸入和提高可維護性 (轉)程式設計
- STL程式設計實踐七:儘量定義class形式的Function Object (轉)程式設計FunctionObject
- 《STL原始碼剖析》 -- stl_algo.h原始碼Go
- 《STL原始碼剖析》-- stl_algobase.h原始碼Go
- 《STL原始碼剖析》-- stl_hashtable.h原始碼
- 《STL原始碼剖析》-- stl_multimap.h原始碼
- 《STL原始碼剖析》-- stl_map.h原始碼
- 《STL原始碼剖析》-- stl_multiset.h原始碼
- 《STL原始碼剖析》-- stl_set.h原始碼
- 《STL原始碼剖析》-- stl_tree.h原始碼
- 《STL原始碼剖析》-- stl_heap.h原始碼
- 《STL原始碼剖析》-- stl_slist.h原始碼
- 《STL原始碼剖析》-- stl_queue.h原始碼
- 《STL原始碼剖析》-- stl_stack.h原始碼
- 《STL原始碼剖析》-- stl_deque.h原始碼
- 《STL原始碼剖析》-- stl_list.h原始碼
- 《STL原始碼剖析》-- stl_pair.h原始碼AI
- 《STL原始碼剖析》-- stl_vector.h原始碼
- 《STL原始碼剖析》-- stl_iterator.h原始碼
- 《STL原始碼剖析》-- stl_uninitialized.h原始碼Zed
- 《STL原始碼剖析》-- stl_alloc.h原始碼
- 《STL原始碼剖析》-- stl_relops.h原始碼
- 《STL原始碼剖析》-- stl_hash_map.h原始碼
- 《STL原始碼剖析》-- stl_hash_set.h原始碼
- 《STL原始碼剖析》-- stl_construct.h原始碼Struct
- C++STL::兩種方式實現STL容器的reference語義C++
- 《STL原始碼剖析》-- stl_config.h原始碼
- 侯老師--STL原始碼剖析--書中的疑問三 (轉)原始碼
- 《STL原始碼剖析》-- memory原始碼
- STL——STL中vector的實現原理
- 2. STL容器結構與分類
- STL程式設計實踐六:自定義型別儘量定義恆等和小於運算子 (轉)程式設計型別