類與物件 複製建構函式

2021-08-28 13:13:59 字數 1818 閱讀 7963

二進位制複製不複製指向的記憶體單元,這導致兩個 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 ...