返回信息流#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
编译器为什么会作这样的优化呢?
这是一条镜像帖。来源:北邮人论坛 / cpp / #37275同步于 2010/3/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
关于复制构造函数的问题
leelgl
2010/3/30镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
constructor 实参1转换成A对象
before return fun函数打印
copy return时复制
deconstructor 形参死
after fun(a) main函数打印
deconstructor a死
我也觉得象LZ应该说的那样,一直搞不大清,在类型转换时是否要用到拷贝构造函数,之前看先是创建个const的临时对象,再用拷贝构造函数拷贝,但这里好象显示只调用了构造函数.
请问下,那个copy打印出来的时候是局部变量复制给临时变量时产生的,还是临时变量复制给
main函数中的a是产生的?
【 在 Vampire 的大作中提到: 】
: constructor 实参1转换成A对象
: before return fun函数打印
: copy return时复制
: ...................
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
: ...................