C 理解拷貝控制成員和建構函式

2021-07-16 01:49:43 字數 2130 閱讀 6823

首先通過例子分析:建構函式,拷貝建構函式,拷貝賦值運算子,析構函式:何時呼叫?

//  定義類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...