1 #include <iostream> 2 using namespace std; 3 class Demo { 4 public: 5 Demo() { cout << "consructor" << endl; }; 6 ~Demo() { cout << "destructor" << endl; } 7 Demo(Demo& obj) { cout << "copy" << endl; } 8 }; 9 void Func(Demo obj) { 10 cout << "func" << endl; 11 } 12 Demo d1; 13 Demo Test() { 14 cout << "test" << endl; 15 return d1; 16 } 17 int main() { 18 Demo d2; 19 Func(d2); 20 Test(); 21 cout << "after test" << endl; 22 return 0; 23 }
运行结果:
consructor
consructor
copy
func
destructor
test
copy
destructor
after test
destructor
destructor
调用步骤:
输出结果 | 具体跳转执行行数 | 操作 |
consructor | row 12 -> row 5 | 创建Demo类对象d1 |
consructor | row 18 -> row 5 | 创建Demo类对象d2 |
copy | row 7 -> row 7 | d2作为参数被Func调用,执行复制函数将d2复制给obj |
func | row 10 | 进入Func函数 |
destructor | row 19 -> row 6 |
销毁Demo类对象obj,其由Func(d2)创建 注意:删除的是临时对象obj而不是d2 |
test | row 14 | 进入Test函数 |
copy | row 20 -> row 7 | d1作为返回值被Test调用执行复制函数 |
destructor | row 20 -> row 6 | 销毁Demo类对象obj,其由Test()创建 |
after test | row 21 | |
destructor | row 12 -> row 6 | 销毁Demo类对象d1,其由row 12创建 |
destructor | row 18 -> row 6 | 销毁Demo类对象d2,其由row 18创建 |
事实证明关键之处还是在于复制函数的调用时机:
原文:https://www.cnblogs.com/Rebel3/p/14411361.html