二進位制複製不複製指向的記憶體單元,這導致兩個 mystring 物件指向同乙個記憶體單元。函式 usemystring( )返回時,變數 str 不再在作用域內,因此被銷毀。為此,將呼叫 mystring 類的析構函式, 而該析構函式使用 delete釋放分配給 buffer 的記憶體,這將導致 main( ) 中的物件 sayhello 指向的記憶體無效,而等 main( )執行完畢時,sayhello 將不再在作用域內,進而被銷 毀。但這次不再有有效的記憶體位址呼叫 delete(銷毀 str 時釋放了該記憶體,導致它無效)。正是 這種重複呼叫 delete 導致了程式崩潰。
eg:
//mystring 類宣告
class mystring }
//以mystring類值做引數
//編譯器以二進位制複製指標buffer
//這時新建立的物件 str.buffer 與 main函式中mystring類物件的buffer指標指向同一片
//記憶體空間,當函式結束,析構函式銷毀buffer指向的記憶體,main 中的物件當程式結束釋放
//時,指向的空間已經銷毀,導致出錯。
複製建構函式是乙個過載的建構函式,由編寫類的程式設計師提供。每當物件被複製時,編譯器都將 呼叫複製建構函式。 為 mystring 類宣告複製建構函式的語法如下:
class mystring
;mystring::mystring(const mystring& copysource)
定義乙個複製建構函式,確保對動態分配的緩衝區進行深複製
輸出結果說明,buffer指向的空間不同,這樣析構函式釋放空間不會再出錯
複製建構函式確保下面的函式呼叫進行深複製:
mystring sayhello("hello from string class");
usemystring(sayhello);
然而,如果通過賦值進行複製時,結果如何呢?
mystring overwrite("who cares? ");
overwrite = sayhello;
由於沒有提供複製賦值運算子 operator=,編譯器提供的預設複製賦值運算子將導致淺複製。 c 類與物件(1) 構造,複製建構函式
當我們定義乙個基本型別變數時,方法如下 int p 定義乙個int型別變數 bool b 定義乙個bool型別變數 float c 定義乙個float型別變數 顯然定義變數p適用於儲存整數型別的,變數b是用於儲存布林型別的,變數c是用於儲存浮點數型別的。但是變數宣告的意義不只是這個,另乙個同樣重要的...
類與物件 組合類的建構函式和複製建構函式
初始化列表是用於構造函式引數的初始化,與其他函式不同,建構函式除了有名字,引數列表和函式體之外,還可以有初始化列表,初始化列表以冒號開頭,後跟一系列以逗號分隔的初始化字段。如 class myclock 建構函式的實現和初始化設定 myclock myclock int hh,int mm,int ...
類和物件 複製建構函式
形如x x x 或x x const x 二選一,後者能以常量物件作為引數 class complex complex c1 呼叫預設無參建構函式 complex c2 c1 呼叫預設的複製建構函式,將 c2 初始化成和c1一樣class complex complex const complex ...