test1:
1 #include2view codeusing
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
執行結果
修改fuc函式為引用或者指標型別。
1test3:void fuc(copy_construction *t)25
67void fuc(copy_construction &t)811
12/*
****引用或者指標型別呼叫時不會呼叫拷貝建構函式***
*/
匿名物件的出現:
1 #include2test5: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/*
*******返回型別為指標或者引用不會呼叫拷貝建構函式********
*/
改變接匿名物件的方式:
1 #include2test6: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
再改變接匿名物件的方式,重寫play_empty()函式:
void play_empty(void)//summary:以下情況會呼叫拷貝建構函式如上所示**,此時物件b會開闢記憶體,在用返回的匿名物件賦值給b,將會在賦值完成之後立即析構匿名物件,這個時候匿名物件不會轉正。
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.初始化和賦值的區別 初始化和...