1拷貝建構函式
背景知識
本章將使用「引用」的語法,請學習/回顧第14章。
拷貝建構函式
拷貝建構函式是一種特殊的建構函式。copy constructor
(1) 它是建構函式,所以函式名是類名、沒有返回值
(2) 它是特殊的建構函式:引數形式是固定的
class object
;拷貝建構函式的意義
拷貝建構函式的含義: 以乙個物件為藍本,來構造另乙個 物件。
object b;
object a(b); // 或寫成 object a = b;
稱作:以b為藍本,建立乙個新的物件a。
(a是b的乙個拷貝/備份,兩者內容完全相同)
拷貝建構函式的呼叫
拷貝建構函式從來不顯式呼叫,而是由編譯器隱式地呼叫。 在以下三種情況:
(1)定義物件
object a;
object b(a); // 或寫成 object b = a;
(2)動態建立物件
object a;
object* p = new object(a);
(3)函式的傳值呼叫
void test(object obj);
注意 (1): 區分「構造」與「賦值」
構造:object a;
object b = a; // 或寫作 object b(a);
// 此為「構造」,在建立物件的時候給初值,拷貝構造函 數被呼叫
賦值:object a(1,2);
object b;
b = a; // 此為「賦值」,不會呼叫拷貝建構函式
注意 (2): 可以訪問同類物件的private成員
在拷貝建構函式,可以訪問引數物件的任意成員
因為它們是同類,所以訪問不受限制。
object(const object& other)
預設的「拷貝建構函式」
當沒有書寫拷貝建構函式時,編譯器會預設提供乙個拷貝構 造函式。預設的拷貝動作:將每乙個成員逐個拷貝。
也就是說,在多數情況下,我們無需操心,編譯器會幫我們 完成成員的拷貝動作。
問題:既然預設拷貝成員是夠用的,為什麼還要自己寫乙個 拷貝建構函式呢?
拷貝建構函式的檢查項
注意:除非必要,不要新增拷貝建構函式。
一旦你決定了要新增拷貝建構函式,請仔細檢查:
(1)所有的成員變數,要依次拷貝 所有成員變數,不要遺漏
(2)呼叫父類的拷貝建構函式
(要麼不負責,要麼負責全部事情)
問題:拷貝建構函式非常麻煩,容易遺漏,為什麼還要自己寫一 個拷貝建構函式呢?
小結拷貝建構函式的語法:(特點)
拷貝建構函式在何時會被呼叫?
編譯器已經預設提供了乙個好用的拷貝建構函式
拷貝建構函式的檢查項:務必仔細檢查,不要遺漏
除非必要,不要新增拷貝建構函式。實際上,只在一種 情況下,才需要新增拷貝建構函式(下一講)
2深度拷貝與淺拷貝
深度拷貝
當以下情況發生時,需要新增拷貝建構函式。示例:
class text
~text()
private:
int m_size;
char* m_buf;
};深度拷貝
int main()
深度拷貝
出什麼會出錯?
// 物件建立
(1)物件t1.m_buf,指向一塊記憶體
(2)物件t2拷貝了t1, t2.m_buf指向了同一塊記憶體
// 物件析構
(1)物件t1析構, delete m_buf;
(2)物件t2析構,delete m_buf;出錯,此塊記憶體已經被 delete
錯誤的根本原因:應該拷貝其資料,而不是拷貝其指標。
解決辦法
(1) 正規解決方法 新增拷貝建構函式,拷貝其具體的資料
text(const text& other)
此種情況稱為「深度拷貝」
解決辦法
(2) 省事的辦法
禁止使用者進行拷貝構造,將拷貝建構函式設定為private。
private:
text(const text& other)
小結學習資源只有在需要深度拷貝的情況下,才需要新增拷貝建構函式。
《c語言/c++學習指南》語法篇(從入門到精通)》
拷貝建構函式,預設拷貝建構函式
拷貝建構函式,預設拷貝建構函式 1.c 的預設拷貝建構函式,從深度拷貝和淺拷貝說起 c 類的預設拷貝建構函式的弊端 c 類的中有兩個特殊的建構函式,1 無參建構函式,2 拷貝建構函式。它們的特殊之處在於 1 當類中沒有定義任何建構函式時,編譯器會預設提供乙個無參建構函式且其函式體為空 2 當類中沒有...
建構函式 拷貝建構函式
建構函式可以分為三類 1 不帶引數的建構函式 在函式體中對資料成員賦初值,這種方式使該類的每乙個物件都得到同一組初值 2 帶引數的建構函式 如果使用者希望對不同的物件賦不同的初值,可以採用帶引數的建構函式。在呼叫不同物件的建構函式時從外面將不同的資料傳遞給建構函式,以實現初始化 3 複製建構函式 建...
建構函式 拷貝建構函式
person person 引用就是指標常量 所以person p person const p,引用所以一旦初始化指向某個位址,就不能在改變了。為什麼前面還要加const,因為拷貝建構函式的目的就是將乙個物件的所有屬性拷貝到另外乙個物件,這個物件的屬性不變,加上const 相當於 const pe...