class A { public: A(){cout<<"A C"<<endl;} ~A(){cout<<"A DDDDDD"<<endl;} }; class B : public A { public: B(){cout<<"B C"<<endl;} ~B(){cout<<"B D"<<endl;} }; void test(A a) { } int main() { B b; test(b); return 0; }
运行结果:
A C
B C
A DDDDDD
A DDDDDD
B D
A DDDDDD
1 class A 2 { 3 public: 4 A(){cout<<"A C"<<endl;} 5 ~A(){cout<<"A DDDDDD"<<endl;} 6 A(A &a){cout<<"A CC"<<endl;} 7 }; 8 9 class B : public A 10 { 11 public: 12 B(){cout<<"B C"<<endl;} 13 ~B(){cout<<"B D"<<endl;} 14 B(B &b){cout<<"B CC"<<endl;} 15 }; 16 17 void test(A a) 18 { 19 20 } 21 22 int main() 23 { 24 B b; 25 test(b); 26 return 0; 27 }
运行结果:
A C
B C
A CC
A DDDDDD
B D
A DDDDDD
问题:两个代码的区别是有无定义拷贝构造函数,未定义时传参为什么输出的是析构函数的内容(也就是为什么会调用析构函数),定以后调用拷贝构造函数没有问题,求高人指点?
1:基本知识,析构函数调用,因为生成了临时对象,看你的test方法怎么传递参数的
2:博问的代码格式化太恶心了,恶心死了,竟然还不支持代码复制,复制了还带着行号,降低回答的积极性啊。
test传参传的是对象,会在栈中用B对象初始化一个A对象,test方法结束后会调用这个形参的析构,但是定义拷贝构造函数和未定义拷贝构造的结果却是不一样的,认为定义了拷贝构造函数的输出结果是没有什么问题的,但是在没有人为定义拷贝构造函数的情况下传参后却调用了析构函数(因为输出是析构的结果),我就是不明白为啥会有这样的析构调用!谢谢您的回复
第一个没有拷贝构造的因为你是值传递,所以会产生临时A类型的对象。只要出了test()函数作用域这会在析构的时候调用。