複製建構函式

2021-07-28 05:28:37 字數 2211 閱讀 6474

所有需要分配系統資源的使用者定義的型別都需要乙個複製建構函式。所以在定義類的時候,是會自動的生成預設的複製建構函式的。複製建構函式是在建立物件時可用同一類的另乙個物件來初始化該物件。同乙個類的物件在記憶體中具有完全相同的結構,如果作為乙個整體進行複雜是完全可行的,這個複製過程只需要複製資料成員,而函式成員是共用的(沒有複雜)。

主要有以下常見的用法:

1、物件在建立時使用其他的物件初始化

person p(q); //此時複製建構函式被用來建立例項p

person p = q; //此時複製建構函式被用來在定義例項p時初始化p

2、物件作為函式的引數進行值傳遞時

f(p); //此時p作為函式的引數進行值傳遞,p入棧時會呼叫複製建構函式建立乙個區域性物件,與函式內的區域性變數具有相同的作用域
需要注意的是,賦值並不會呼叫複製建構函式,賦值只是賦值運算子(過載)在起作用

p =q; //此時沒有複製建構函式的呼叫!
簡單來記的話就是,如果物件在宣告的同時將另乙個已存在的物件賦給它,就會呼叫複製建構函式;如果物件已經存在,然後將另乙個已存在的物件賦給它,呼叫的就是賦值運算子(過載)。

預設的複製建構函式和賦值運算子進行的都是」shallow copy」,只是簡單地複製字段,因此如果物件中含有動態分配的記憶體,就需要我們自己重寫複製建構函式或者過載賦值運算子來實現」deep copy」,確保資料的完整性和安全性。

下面進行演示物件在使用複製建構函式的建立和撤銷的過程:

#include

using

namespace

std;

class

complex

complex(double r, double i=0.0)

void assign(complex com)

void print()

};inline

complex::complex(complex &com)

complex fun(complex);

complex global;

int main(int argc, _tchar* argv)

complex fun(complex com)

下面對程式執行過程進行分析:

1、initializing 0 0 // 全域性物件首先建立,呼叫預設的建構函式

2、entering main // 進入入口函式

3、initializing 0 0 // 呼叫預設的建構函式建立com1

4、initializing 5.6 7.5 // 呼叫帶引數的建構函式建立com2

5、copy 0 0 // 呼叫複製建構函式建立com3

6、0+0i // 列印com3

7、0+0i // 列印global

8、copy 5.6 7.5 // 呼叫全域性函式fun(),呼叫複製建構函式建立臨時物件com

9、entering function // 進入全域性函式fun()

10、copy 5.6 7.5 // 進入global.assign(),呼叫複製建構函式建立臨時新物件com

11、destructor //退出global.assign(),呼叫析構函式,撤銷新com

12、exiting function // 退出全域性函式fun()

13、copy 5.6 7.5 // 返回物件時,呼叫複製建構函式建立臨時物件

14、destructor //退出fun(),呼叫析構函式,撤銷fun()的com

15、destructor // 返回的臨時物件,賦給com1後析構

16、5.6+7.5i // 列印com1

17、exist main // 退出入口函式

18、destructor // 退出入口函式前,呼叫析構函式,撤銷com3

19、destructor // 退出入口函式前,呼叫析構函式,撤銷com2

20、destructor // 退出入口函式前,呼叫析構函式,撤銷com1

21、destructor // 退出入口函式前,呼叫析構函式,撤銷global

注意:在涉及到值傳遞(函式引數,函式返回)時,系統都會自動的產生乙個無名的臨時變數來儲存需要傳遞的值。

複製建構函式

今天回看了前面的內容,發現這一章掌握的不夠好,就重看了一遍,順便總結一下 無規律總結 複製建構函式用於複製物件,即可以初始化物件,也可以將複製得到的物件作為實參傳遞給函式,多用於初始化。當我們這樣寫 string null bulk 9 9 9 9 在建立null bulk時編譯器先呼叫string...

複製建構函式

拷貝建構函式的標準寫法如下 class base base const base b 上述寫法見得最多,甚至你認為理所當然。那麼如果我們不寫成引用傳遞呢,而是值傳遞,那麼會怎樣?class base base const base b 編譯出錯 error c2652 base illegal co...

複製建構函式

呼叫複製建構函式的情形 在c 中,下面三種物件需要呼叫複製建構函式 1 乙個物件作為函式引數,以值傳遞的方式傳入函式體 2 乙個物件作為函式返回值,以值傳遞的方式從函式返回 3 乙個物件用於給另外乙個物件進行初始化 常稱為賦值初始化 4 編譯器生成臨時物件 一 乙個物件作為函式引數,以值傳遞的方式傳...