2013-01-07 151 views
0

我有疑问,在下面的代码段。函数fun1fun2都是相同的。在一个我声明了一个局部变量,而在另一个变量是由参数传递。那么为什么在fun1的情况下复制构造函数不会被调用。局部变量和变量传递作为参数

#include<stdio.h> 
#include<iostream> 
using namespace std; 
class A 
{ 
    public: 
A() 
{ 
    printf("constructor\n"); 
} 
A(const A&) 
{ 
    printf("copy cons\n"); 
} 
~A() 
{ 
    printf("destructor\n"); 
} 
}; 
A fun1() 
{ 
A obj; 
return obj; 
} 
A fun2(A obj) 
{ 
return obj; 
} 

int main() 
{ 
    A a=fun1(); 
    printf("after fun1\n"); 
    A b; 
    A c = fun2(b); 
} 

输出

constructor 
after fun1 
constructor 
copy cons 
copy cons 
destructor 
destructor 
destructor 
destructor 
+0

其方式C++的设计!的 –

+0

可能重复[什么是复制省略和返回值优化?(http://stackoverflow.com/questions/12953127/what-are-copy-elision-and-return-value-optimization) –

回答

1

因为Named Return Value Optimization的,这是一个optimziation编译器执行您的代码。它承认一个事实,即功能FUN1()的返回类型是FUN1中的临时对象相同的()(A型),所以它不创建一个副本(不调用拷贝构造函数)返回声明。

您可以尝试编译代码without optimization,看看拷贝构造函数被调用即可。如果您使用的是gcc编译器,则关闭优化的编译器标志为“-O0”。

1

那么为什么在FUN1的情况下拷贝构造函数不叫?

如果A有可访问的副本或移动构造函数,编译器可以选择删除副本。这就是所谓的(命名的)返回值优化((N)RVO)