调用复制构造函数的三种情况:
1.当用类一个对象去初始化另一个对象时。
2.如果函数形参是类对象。
3.如果函数返回值是类对象,函数执行完成返回调用时。
#include <iostream> using namespace std; class Test{ public: Test(){ } //复制构造函数 Test(const Test &t) {cout<< 1;} }; //传参是对象的引用,不调用复制构造函数。 //传参是对象,调用复制构造函数。 Test fun1(Test &u) { Test t=u; //初始化时用=号,就是Test t(u); 调用复制构造函数。而在赋值语句中的=号,不调用。像 Test x,y; x=y; return t; //返回值是对象,调用复制构造函数 } Test& fun2(Test &u) { Test t=u; return t; //返回值是对象的引用,不调用复制构造函数 } Test fun3(Test u) { Test t=u; return t; //返回值是对象,调用复制构造函数 } int main() { Test x,y; x=fun1(y); cout<< " --------------- "; x=fun2(y); cout<< " --------------- "; x=fun3(y); cout<<endl; return 0; }
vc6.0下的结果:
VS2013下的结果:
CodeBlock下的结果:(据说是gcc编译器把函数返回对象给优化了)就像 return Complex(2, 4); 优化了
------------------------------------------------------------------------------------------------------------------
可以参考:https://blog.csdn.net/sxhelijian/article/details/50977946