0 c++ constructor copy-constructor
可能重复:
为什么在这种情况下不调用复制构造函数?
在下面的代码中,我构造了三个变量a1,a2和a3.
C++ Primer p.476中有一个例子:
string empty_copy = string();//copy-initialization
Run Code Online (Sandbox Code Playgroud)
有没有人可以帮我解释一下
1)为什么a1和a2不是由复制构造函数构造的
2)我的代码中的初始化a2和书中的empty_copy有什么区别?
非常感谢!
#include<iostream>
using namespace std;
class A{
public:
A(){}
A(int v){}
A(const A&x){
cout<<"copy constructor"<<endl;
}
};
A generateA(){
return A(0);
}
int main(){
cout<<"First:"<<endl;
A a1=generateA();
cout<<"Second:"<<endl;
A a2=A(0);
cout<<"Third:"<<endl;
A a3=a1;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是(在Win7中的Visual Studio 2010和Ubuntu10.10中的g ++):
First:
Second:
Third:
copy constructor
Run Code Online (Sandbox Code Playgroud)
由于返回值优化,这是复制省略.
允许编译器通过应用此类优化来优化副本的生成.
A a1=generateA();
A a2=A(0);
Run Code Online (Sandbox Code Playgroud)
在上述两种情况下,编译器都可以消除创建临时对象的过程,该临时对象是为了保存返回值而创建的.
A a3=a1;
Run Code Online (Sandbox Code Playgroud)
涉及一个已经存在的命名对象a1,用于构造a3它涉及一个复制构造函数调用,编译器必须调用该函数并且无法进行优化.
编辑: 在评论中回答问题.
您可以通过在编译期间使用以下选项告诉编译器不应用此优化:
对于GCC:
-fno-elide-constructors
Run Code Online (Sandbox Code Playgroud)
对于MVSC:
/Od
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
225 次 |
| 最近记录: |