C CLI思辨錄之拷貝建構函式

2021-09-03 04:55:06 字數 1011 閱讀 6332

雖然物件複製看上去很簡單,然而如果你沒有對其正確理解,可能會出現一些嚴重問題。預設情況下,複製物件會導致相應的所有成員的複製。如果你只有例項成員,這看上去是相當不錯的。但是如果你的類中含有指向在堆中分配的物件時,情況會怎樣呢?考慮下面的**片斷:

#include

#include

class person

void setname(const char* name)

void printname()

}; int main()

這裡的類person有乙個指向在堆上分配的字元陣列的指標。當構造person物件時,它建立該字元陣列並把它的位置存放到變數_name中。

但是當你建立person 物件 p2 時,p2的成員用p1的成員初始化。因而,p1的 _name與p2的 _name指向相同的堆物件。如在上例中看到的,呼叫p2.setname將改變由這兩個類共享的值。所以,當第二次呼叫p1.printname,列印結果是"alice"。

所以,這不是我們複製物件所期望的結果,而且還會導致堆崩潰的問題。請再考慮某個函式刪除了該陣列而p1又要呼叫該函式的情況?下面,當p2呼叫printname時,它將盡量訪問實際上不是在堆上的物件。這種情況下產生的結果往往是難以預料的。

c++允許我們通過定義拷貝建構函式來克服這類問題。在我們每次通過複製另乙個物件來初始化乙個物件時,拷貝建構函式都被執行。你可以在拷貝建構函式中覆蓋掉預設的成員函式的複製行為。

所以,我們的類person應該修改如下:

class person

// 這是拷貝建構函式。在此我們初始化乙個新的陣列,為person的例項所用

person(person&)

void setname(const char* name)

void printname()

}; 這裡類person中的拷貝建構函式保證了它初始化乙個新的陣列,為在複製時產生的每乙個物件例項所用。這就避免了前面我們提到的問題。

希望上面所述能夠幫助讀者理解拷貝建構函式及其使用場所。

C CLI思辨錄之再談繼承

在物件導向程式設計領域乙個關鍵的概念是繼承。在oo和c 中,類成員共有三種級別的繼承 public,protected和private。對於基類成員的訪問操作應該依賴於下面兩個因素 派生類宣告其類頭 public,protected 或 private 的方式 對類成員的訪問指定標誌 public,...

C CLI思辨錄之Object的物件布局

c cli相對純c 來說,支援建立託管引用物件,託管物件由虛擬機器來分配記憶體和管理,程式設計師可以不再擔心記憶體洩漏的問題。其實,說白了也就是相當於自己建立乙個記憶體池,並且虛擬機器實際上也是這樣做的。在cli中,所有的類都從object派生,包括int這樣的值。那麼object的內部結構是怎麼樣...

C CLI思辨錄之Object的物件布局

c cli相對純c 來說,支援建立託管引用物件,託管物件由虛擬機器來分配記憶體和管理,程式設計師可以不再擔心記憶體洩漏的問題。其實,說白了也就是相當於自己建立乙個記憶體池,並且虛擬機器實際上也是這樣做的。在cli中,所有的類都從object派生,包括int這樣的值。那麼object的內部結構是怎麼樣...