调用拷贝构造函数的三种情况1用一个类对象初始化另一个类对象2函数的形参是类对象3函数的返回值是类对象拷贝构造函数的参数必须是引用原因例如 A a; A b(a);用对象a初始化b需要调用拷贝构造函数向拷贝构造函数传递实参a时若参数不是引用则又需要调用拷贝构造函数因此导致无限递归调用拷贝构造函数栈溢出。class A { public: A(){coutA is construting...endl;} A(const A a){coutA is cloning...endl;} ~A(){coutA is deconstructing...endl;} }; A func( A a) { return a; } int main() { A a; coutendlendl; //example 1: A b1a; coutendlendl; A b2(a); coutendlendl; //example 2: A c1 func(a); coutendlendl; A c2(func(a)); coutendlendl; //example 3: A d; d func(a); coutendlendl; A e; e a; coutendlendl; return 0; }输出1.可以返回局部变量但是不能返回局部变量的引用。2.example 1: 调用拷贝构造函数对b初始化example 2: A c1func(a)或者A c2(func(a))传递实参对象a调用一次拷贝构造函数得到形参对象a返回形参对象a到main函数再调用一次拷贝构造函数生成临时对象tmp形参对象a析构main函数中对象c指向临时对象tmp临时对象不再析构所以只调用一次析构函数example 3A d; dfunc(a) 调用构造函数初始化d传递实参对象a调用一次拷贝构造函数得到形参对象a返回形参对象a到main函数再调用一次拷贝构造函数生成临时对象tmp形参对象a析构临时对象tmp对对象d进行赋值操作临时对象tmp析构所以调用两次析构函数A e; ea; 调用构造函数初始化e调用赋值函数用a对e进行赋值总结只有在创建一个新对象时才会调用构造函数不管是普通构造函数、拷贝构造函数还是移动构造函数因为构造函数的工作就是对对象做一些初始化的工作。对象已经创建完成之后再用一个对象赋值给另一个对象调用的是赋值函数切记不要搞混对类添加了赋值运算符后赋值运算符编译器会自动添加证明了我的以上分析过程class A { public: A() { cout A is construting... endl; } A(const A a) { cout A is cloning... endl; } ~A() { cout A is deconstructing... endl; } A operator (const A a) { cout 赋值运算 endl; return *this; } }; A func(A a) { return a; } int main() { A a; cout endl endl; //example 1: A b1 a; cout endl endl; A b2(a); cout endl endl; //example 2: A c1 func(a); cout endl endl; A c2(func(a)); cout endl endl; //example 3: A d; d func(a); cout endl endl; A e; e a; cout endl endl; return 0; }输出
C++拷贝构造函数
调用拷贝构造函数的三种情况1用一个类对象初始化另一个类对象2函数的形参是类对象3函数的返回值是类对象拷贝构造函数的参数必须是引用原因例如 A a; A b(a);用对象a初始化b需要调用拷贝构造函数向拷贝构造函数传递实参a时若参数不是引用则又需要调用拷贝构造函数因此导致无限递归调用拷贝构造函数栈溢出。class A { public: A(){coutA is construting...endl;} A(const A a){coutA is cloning...endl;} ~A(){coutA is deconstructing...endl;} }; A func( A a) { return a; } int main() { A a; coutendlendl; //example 1: A b1a; coutendlendl; A b2(a); coutendlendl; //example 2: A c1 func(a); coutendlendl; A c2(func(a)); coutendlendl; //example 3: A d; d func(a); coutendlendl; A e; e a; coutendlendl; return 0; }输出1.可以返回局部变量但是不能返回局部变量的引用。2.example 1: 调用拷贝构造函数对b初始化example 2: A c1func(a)或者A c2(func(a))传递实参对象a调用一次拷贝构造函数得到形参对象a返回形参对象a到main函数再调用一次拷贝构造函数生成临时对象tmp形参对象a析构main函数中对象c指向临时对象tmp临时对象不再析构所以只调用一次析构函数example 3A d; dfunc(a) 调用构造函数初始化d传递实参对象a调用一次拷贝构造函数得到形参对象a返回形参对象a到main函数再调用一次拷贝构造函数生成临时对象tmp形参对象a析构临时对象tmp对对象d进行赋值操作临时对象tmp析构所以调用两次析构函数A e; ea; 调用构造函数初始化e调用赋值函数用a对e进行赋值总结只有在创建一个新对象时才会调用构造函数不管是普通构造函数、拷贝构造函数还是移动构造函数因为构造函数的工作就是对对象做一些初始化的工作。对象已经创建完成之后再用一个对象赋值给另一个对象调用的是赋值函数切记不要搞混对类添加了赋值运算符后赋值运算符编译器会自动添加证明了我的以上分析过程class A { public: A() { cout A is construting... endl; } A(const A a) { cout A is cloning... endl; } ~A() { cout A is deconstructing... endl; } A operator (const A a) { cout 赋值运算 endl; return *this; } }; A func(A a) { return a; } int main() { A a; cout endl endl; //example 1: A b1 a; cout endl endl; A b2(a); cout endl endl; //example 2: A c1 func(a); cout endl endl; A c2(func(a)); cout endl endl; //example 3: A d; d func(a); cout endl endl; A e; e a; cout endl endl; return 0; }输出