一、整體**
test.h
[cpp]
#ifndef _test_h_
#define _test_h_
class test
public:
// 如果類不提供任何乙個建構函式,系統將為我們提供乙個不帶引數的
// 預設的建構函式
test();
explicit test(int num);
test(const test& other);
void display();
test&operator=(const test& other);
~test();
public:
int num_;
#endif// _test_h_
test.cpp
[cpp]
#include"test.h"
#include
usingnamespace std;
// 不帶引數的建構函式稱為預設建構函式
test::test() : num_(0)
//num_ = 0;
cout《"initializing default"《endl;
test::test(int num) : num_(num)
//num_ = num;
cout《"initializing "《num_《endl;
test::test(const test& other) : num_(other.num_)
//num_ = other.num_;
cout《"initializing with other "《num_《endl;
test::~test()
cout《"destroy "《num_《endl;
void test::display()
cout《"num="《num_《endl;
test& test::operator=(const test& other)
cout《"test::operator="《endl;
if (this==&other)
return*this;
num_ = other.num_;
return*this;
01.cpp
[cpp]
01.cpp
#include"test.h"
#include
usingnamespace std;
test testfun(test t)
t.num_=12;
return t;
test& testfun2(test t)
return t;
test testfun3(test& t)
return t;
test& testfun4(test& t)
//return const_cast(t);
return t;
int main(void)
test t(10);
test t2 = testfun(t);
cout《"……"《endl;
return 0;
二、執行結果
1、test t2 = testfun(t);
(1)test t(10) :生成乙個物件1(num_是10),對應initializing 10
(2)把t物件傳遞到形式引數時:呼叫拷貝建構函式,由物件1生成了乙個物件2(num_是10),之後又改變了num_為12,對應initializing with other10
(3)返回值時:呼叫了拷貝建構函式,由物件2生成了乙個物件3(num_是12),對應initializing with other12
(5)testfun返回後:物件2銷毀了,對應destroy 12
(6)……
(7)程式結束後:首先銷毀聽t2(接管了物件1),然後銷毀物件1,對應destroy 12 ,destroy 10
testfun(t) 此時沒有物件接管,執行結果如下:
(1)test t(10) :生成乙個物件1(num_是10),對應initializing 10
(2)把t物件傳遞到形式引數時:呼叫拷貝建構函式,由物件1生成了乙個物件2(num_是10),之後又改變了num_為12,對應initializing with other10
(3)返回值時:呼叫了拷貝建構函式,由物件2生成了乙個物件3(num_是12),對應initializing with other12
(4)testfun返回後:物件3銷毀,物件2銷毀,對應destroy 12,destroy 12
(5)……
(6)程式結束後:銷毀物件1,對應destroy 10
2、test t2 = testfun2(t);
(1)test t(10) :生成乙個物件1(num_是10),對應initializing 10
(2)把t物件傳遞到形式引數時:呼叫拷貝建構函式,由物件1生成了乙個物件2(num_是10),對應initializing with other 10
(3)test t2 = testfun2(t):由物件2生成了物件3(num_是10),對應initializing with other 10
(4)testfun2返回後:物件2銷毀,對應destory 10
(5)……
(6)程式結束後:銷毀物件3,銷毀物件1,對應destory 10,destory 10
3、test t2 = testfun3(t);
(1)test t(10) :生成乙個物件1(num_是10),對應initializing 10
(2)返回值時:由物件1生成了物件2(num_是10),對應initializing with other 10
(3)test t2 = testfun3(t):t2物件接管了物件2
(4)……
(5)程式結束後:銷毀t2物件,銷毀物件1,對應destroy 10,destroy 10
4、test t2 = testfun4(t);
(1)test t(10) :生成乙個物件1(num_是10),對應initializing 10
(2)test t2 = testfun4(t):由物件1生成了物件t2(num_是10),對應initializing with other 10
(3)……
(4)程式結束後:銷毀t2物件,銷毀物件1,對應destroy 10,destroy 10
三、什麼時候會呼叫
拷貝建構函式
乙個物件初始化另乙個全新的物件時,會呼叫,如test t; test t2 = t;
test t ; test t2; t2=t1;會呼叫
賦值語句。
C 建構函式 拷貝建構函式
建構函式 class base private int m var 建構函式無返回值型別,函式名和型別相同。拷貝建構函式傳遞引數為引用。1 class base2 7 拷貝建構函式 8 base base ref m var ref m var 9 11 private 12 intm var 13...
C 拷貝建構函式
1 什麼時候會用到拷貝建構函式?當任何你想影印東西的時候,而不管東西被影印成什麼樣子。即任何你想利用乙個已有的類例項給另乙個類例項賦值時,這種賦值可能是顯式的,也可能是隱式的 顯式 classa 1 class 2 隱式 函式的形參有用到類物件卻沒有用引用或傳址技術時 函式的返回值是乙個物件也沒有應...
C 拷貝建構函式
1 拷貝構造 copy建構函式用於將乙個物件拷貝到新建立的物件中。也就是說它用於初始化過程中,而不是常規的賦值過程中。一般的copy建構函式原型通常如下 class name const class name rhs 它接受乙個指向類物件的常量引用作為引數。例如,cstring類的拷貝建構函式的原型...