BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #37275同步于 2010/3/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

关于复制构造函数的问题

leelgl
2010/3/30镜像同步10 回复
#include <iostream> using namespace std ; class A { public: A(int i):a(i){cout<<"constructor"<<endl;} A(const A& other){cout<<"copy"<<endl;} ~A(){cout<<"deconstructor"<<endl;} private: int a ; }; A fun( A a ) { cout<<"before return"<<endl; return a ; } int main() { A a = fun(1) ; cout<<"after fun(a)"<<endl ; return 0 ; } 输出结果为: constructor before return copy deconstructor after fun(a) deconstructor 我认为应该是 constructor //创建fun参数临时变量 copy //return时复制到返回值 deconstructor //析构参数临时变量 before return copy //以返回的临时变量为参数调用复制构造函数,构造A a deconstructor //析构返回临时变量 after fun(a) deconstructor //退出main后析构a 编译器为什么会作这样的优化呢?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Vampire机器人#1 · 2010/3/30
constructor 实参1转换成A对象 before return fun函数打印 copy return时复制 deconstructor 形参死 after fun(a) main函数打印 deconstructor a死
aillixu机器人#2 · 2010/3/30
我也觉得象LZ应该说的那样,一直搞不大清,在类型转换时是否要用到拷贝构造函数,之前看先是创建个const的临时对象,再用拷贝构造函数拷贝,但这里好象显示只调用了构造函数.
bohou机器人#3 · 2010/3/31
一楼说得对!
a206206机器人#4 · 2010/3/31
楼主打的第二行的copy是哪来的啊
zenith机器人#5 · 2010/3/31
【 在 a206206 的大作中提到: 】 : 楼主打的第二行的copy是哪来的啊 他的意思也许是函数实参到形参的拷贝?
arr机器人#6 · 2010/3/31
1L说的对,fun(1) 是隐式转换
jackyc1989机器人#7 · 2010/4/1
请问下,那个copy打印出来的时候是局部变量复制给临时变量时产生的,还是临时变量复制给 main函数中的a是产生的? 【 在 Vampire 的大作中提到: 】 : constructor 实参1转换成A对象 : before return fun函数打印 : copy return时复制 : ...................
ericyosho机器人#8 · 2010/4/1
就是直接优化掉了呗,因为没有发现要反复调用构造函数有任何的意义,所以就直接在原地构造了对象。
taps机器人#9 · 2010/4/4
A Func(A a) {return a;} A bb; A aa = Func(bb)一般不是按照lz说的方式执行,函数Func会被编译器加上隐藏参数: void Func(A &_hiddenArg, A a) { _hiddenArg.A::A(a); // the copy constructor for A return; } 详见 http://msdn.microsoft.com/en-us/library/ms364057%28VS.80%29.aspx 【 在 leelgl 的大作中提到: 】 : #include <iostream> : using namespace std ; : class A : ...................