c 之拷貝構造函式呼叫時機

2022-05-14 13:27:28 字數 2179 閱讀 8985

test1:

1 #include2

using

namespace

std;

3class

copy_construction

10 copy_construction(const copy_construction &obj)

1115 ~copy_construction()

1619

private:20

inta;

21};

22void

fuc(copy_construction t)

2326

void play_empty(void)27

34int

main()

35

view code

執行結果

修改fuc函式為引用或者指標型別。

1

void fuc(copy_construction *t)25

67void fuc(copy_construction &t)811

12/*

****引用或者指標型別呼叫時不會呼叫拷貝建構函式***

*/

test3:

匿名物件的出現:

1 #include2

using

namespace

std;

3class

copy_construction

10 copy_construction(const copy_construction &obj)

1115 ~copy_construction()

1619

private:20

inta;

21};

22 copy_construction fuc(void)23

//執行到該處,先析構物件a,匿名物件是否析構要看怎麼去接

28//

如下所示直接呼叫fuc()則此時匿名物件會被立即析構

29void play_empty(void)30

33int

main()347

8 copy_construction &fuc(void)9

1415

16/*

*******返回型別為指標或者引用不會呼叫拷貝建構函式********

*/

test5:

改變接匿名物件的方式:

1 #include2

using

namespace

std;

3class

copy_construction

10 copy_construction(const copy_construction &obj)

1115 ~copy_construction()

1619

private:20

inta;

21};

22 copy_construction fuc(void)23

//析構物件a,根據下面**的接匿名物件的方式,

28//

此時匿名物件不僅不會馬上析構,還會轉正成為物件b

29//

從c++設計哲學上來說,這也是提高效率的一種方式,這樣的設計是合理的,因為你想建立物件b,我就不用再新開闢記憶體了,直接用之前的匿名物件代替

30void play_empty(void)31

35int

main()

36

test6:

再改變接匿名物件的方式,重寫play_empty()函式:

void play_empty(void)//

如上所示**,此時物件b會開闢記憶體,在用返回的匿名物件賦值給b,將會在賦值完成之後立即析構匿名物件,這個時候匿名物件不會轉正。

summary:以下情況會呼叫拷貝建構函式

1.直接初始化和拷貝初始化時

2.將乙個物件作為實參傳遞給乙個非引用或非指標型別的形參時

3.從乙個返回型別為非引用或非指標的函式返回乙個物件時

4.用花括號列表初始化乙個陣列的元素或者乙個聚合類(很少使用)中的成員時。

C 拷貝構造函式呼叫時機

class a 傳入乙個字串代表變數的名字 a string n name n a 拷貝建構函式a const a a 過載 運算子 a operator const a a friend ostream operator ostream os,const a a private string na...

C 拷貝建構函式的呼叫時機

include iostream using namespace std class test2 test2 int a test2 int a,int b 有參建構函式 兩個引數 test2 析構函式 test2 const test2 obj void printf void main31 in...

C 拷貝建構函式的呼叫時機

當以拷貝的方式初始化物件時會呼叫拷貝建構函式,這裡需要注意兩個關鍵點,分別是以拷貝的方式和初始化物件 1.初始化物件 初始化物件是指,為物件分配記憶體後第一次向記憶體中填充資料,這個過程會呼叫建構函式,物件被建立後必須立即初始化。也就是說只要建立物件就會呼叫建構函式。2.初始化和賦值的區別 初始化和...