C/C++什麼時候需要定義一個複製構造函數

1.關於複製構造函數

複製構造函數用於將一個對象複製到新創建的對象中。也就是說,它用於初始化過程中(包括按值傳遞參數),而不是常規的賦值過程中,類的複製構造函數原型如下:

ClassName(const ClassName &)

注意:這裏之所以使用引用,可以有效的防止無限遞歸的去調用複製構造函數,可以節省調用構造函數的時間以及存儲新對象的空間。

2.何時調用複製構造函數

新建一個對對象並將其初始化爲同類現有對象時,複製構造函數都將被調用。這在很多情況下都可能發生,最常見的情況是將新對象顯式地初始化爲現有的對象。下面4種聲明都將調用複製構造函數:

(1) CStringBad ditto(motto);
(2) CStringBad metto =motto;
(3) CStringBad also =CStringBad(motto);
(4) CStringBad* pStringBad = new CStringBad(motto);

注意:metto = motto;這種爲賦值操作,並不會調用複製構造函數。此外,每當程序生成了對象副本時,編譯器都會將使用複製構造函數,具體的說,當函數按值傳遞對象或函數返回對象時。都會調用複製構造函數。

3.默認複製構造函數的功能

默認複製構造函數逐個複製非靜態成員(成員的複製也稱爲淺拷貝),複製的是成員的值。
淺拷貝僅僅是按值複製的,如果存在成員變量中存在指針,淺拷貝的結果會使得兩個指針指向同一個內存空間,當其中一個指針被釋放時,會導致另外一個指針指向一塊不可用的內存,從而導致異常。

4.定義一個顯示的複製構造函數以解決此問題

解決類設計中的這種問題的方法是進行深拷貝,最簡單的方法是使用memcpy(),即進行內存複製。

總結:如果類中包含了使用new初始化的指針成員,應當定義一個複製構造函數;以複製指向的數據,而不是指針,這被稱爲深度拷貝。
複製的另二種形式(成員複製或淺拷貝)只是複製指針值。淺複製僅淺淺地複製指針信息,而不會深入“挖掘”以複製指針引用的結構。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章