c++ - 我对 C++ 中的复制构造函数感到困惑

标签 c++ constructor copy-constructor

<分区>

Possible Duplicate:
Why copy constructor is not called in this case?

在下面的代码中,我构造了三个变量a1、a2和a3。

C++ Primer p.476 中有一个示例:

string empty_copy = string();//copy-initialization

有没有人可以帮我解释一下

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;
}

输出是(在Win7的Visual Studio 2010和Ubuntu10.10的g++下):

First:
Second:
Third:
copy constructor

最佳答案

这是由于 Return value optimization 造成的复制省略.
允许编译器通过应用此类优化来优化拷贝的生成。

A a1=generateA(); 
A a2=A(0); 

在上述两种情况下,编译器可以消除为保存返回值而创建的临时对象的创建。

A a3=a1;

涉及一个已经存在的命名对象 a1,它用于构造 a3 这涉及一个复制构造函数调用,编译器必须进行并且不能优化。

编辑:回答评论中的问题。

您可以在编译期间使用以下选项告诉编译器不要应用此优化:

对于海湾合作委员会:

-fno-elide-constructors

对于MVSC:

/Od

关于c++ - 我对 C++ 中的复制构造函数感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9681050/

相关文章:

java - 扩展抽象类

C++ 复制构造函数失败

c++ - 复制构造函数上的程序崩溃

c++ - Qt Designer 中的自定义菜单操作

c++ - 计算多边形在网格中旋转后所占的位置

c++ - 使用 Howard Hinnant 的库解析带有时区名称的日期/时间时出现问题

java - 用完系统资源(在 shell 脚本中执行许多程序)

Java 内部类 : extends keyword for multiple

java - 根据子类型信息初始化父类(super class)型成员

c++ - 将具有 unique_ptr 的类的构造函数作为成员复制到抽象类