2011-05-21 125 views
2

我在why my local object destroyed twice?之前发布了一个类似的问题,但我对其他问题感到困惑。返回值作为函数参数

这里的程序:

class AT 
{ 
public: 
    int a; 

    AT() { cout<<"construct"<<endl; } 

    AT(const AT& at) { cout<<"copy"<<endl; } 

    ~AT() { cout<<"destroy"<<endl; } 
}; 

AT func(AT at) 
{ 
    return at; 
} 

AT func2(AT at) 
{ 
    at.a = 5; 
    return at; 
} 

然后我打电话:

AT at; 
func2(func(at)); 

输出为:

construct 
copy 
copy 
destroy 
copy 
destroy 
destroy 

我想会有4复制和4破坏输出,我很清楚func(at),参数被复制,并且返回值被复制,并且两者都在以后被销毁。但在func2()中,似乎该参数未被复制。这是否意味着:如果将返回值传递给参数,参数将不会被复制?

回答

2
AT func(AT at) 
{ 
    return at; 
} 

可能是一些编译器优化。

At不会被创建,只会在事后销毁。 取而代之的是,func的参数用于直接创建func2的参数,就好像你已经调用了func2(at);

+0

我在VS2010中编译,关闭了optmization。 – demaxSH 2011-05-21 02:18:04

+0

http://msdn.microsoft.com/en-us/library/a8kfxa78(v=vs.80).aspx“因为返回值不会复制到另一个对象,所以会创建一个临时对象。”所以在func2(func(at))中没有创建临时的。 – 2011-05-21 02:27:37

+0

好的,我明白了。如果将返回值分配给某个对象,则不会创建临时对象。如果没有赋值,则创建一个临时对象。 – demaxSH 2011-05-21 02:35:00