首先通過例子分析:建構函式,拷貝建構函式,拷貝賦值運算子,析構函式:何時呼叫?
// 定義類test
class test
//拷貝建構函式
test & operator=(const test &) //拷貝賦值運算子
~test();
private:
};inline test::test()
inline test::~test()
// 測試函式func ;
test func(test t)
// main 函式
test a;
test b = a;
test c;
c = b;
func(c);
關於inline內聯函式說明:c++ primer p244
1.內聯機制用於優化:規模較小,流程直接,頻繁呼叫的函式;
2.類內部定義的成員函式(不是宣告)是自動inline的;
3.對於類內部宣告的成員函式,要想內聯,則在定義時(定義在於類相同的標頭檔案中),前面加關鍵字inline;
對於上面的程式,輸出結果為:
分析如下:
test a //呼叫預設建構函式
test b = a //呼叫拷貝建構函式:因為此處為拷貝初始化,要麼呼叫拷貝建構函式,要麼呼叫移動建構函式;c++ primer p411
test c; //呼叫預設建構函式
c = b; // 呼叫拷貝賦值運算子 c++ primer p443
分析func版本1:
func(c);
test func(test t) //將乙個物件作為實參傳遞給乙個非引用型別的形參,發生拷貝初始化
然後開始呼叫析構函式(從後往前)
第乙個輸出的 ~test(),對臨時物件的銷毀;
第二個,對x物件的銷毀;
第三個,對t物件的銷毀;
分析func版本2:
輸出為:
test& func(test &t) //傳遞為引用,不進行拷貝初始化,只是將其值給到t,類似於指標
然後開始呼叫析構函式(從後往前)
第乙個輸出的 ~test(),對x物件的銷毀
分析func版本3:
輸出為:
然後開始呼叫析構函式(從後往前)
第乙個輸出的 ~test(),對臨時物件的銷毀;
第二個,對x物件的銷毀;
分析func版本4:
輸出為:
然後開始呼叫析構函式(從後往前)
第乙個輸出的 ~test(),對臨時物件的銷毀;
分析func版本5:
輸出為:
然後開始呼叫析構函式(從後往前)
第乙個輸出的 ~test(),對x物件進行銷毀;
建構函式和複製控制成員
建構函式和複製控制成員不能繼承 即建構函式,析構函式,複製建構函式,賦值操作符 每個類定義自己的建構函式和複製控制成員。像任何類一樣,如果類不定義自己的預設建構函式和複製控制成員,就將使用合成版本。派生類建構函式 派生類的建構函式受繼承關係的影響,每個派生類建構函式除了初始化自己的資料成員之外,還要...
C 編譯器合成預設建構函式和複製控制成員的條件
參考自 深入理解c 物件模型 c 新手一般有兩個常見的誤解 任何class如果沒有定義default constructor,就會被合成乙個出來.編譯器合成出來的default constructor會明確設定class 內每乙個data member的預設值.現在主要解釋第一條為什麼是錯誤的,根據...
c 建構函式和拷貝建構函式
c 中為什麼要使用建構函式?c 是從c演變過來的,c中存在的是結構體,例如 對點point struct point 但是對點的操作還要在外部使用函式來實現。c 中包括了成員屬性和成員方法,但是由於類的封裝性,不能像普通變數乙個對成員屬性就行初始化,所以使用建構函式。class point doub...