首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我对C++中的复制构造函数感到困惑

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

Stack Overflow用户
提问于 2012-03-13 09:07:56
回答 3查看 238关注 0票数 0

可能重复: 为什么在这种情况下不调用复制构造函数?

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

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

代码语言:javascript
复制
string empty_copy = string();//copy-initialization

有没有人能帮我解释一下

1)为什么a1和a2不是由复制构造函数和

2)在我的代码中初始化a2和书中的empty_copy有什么区别?

非常感谢!

代码语言:javascript
复制
#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 2010和Ubuntu10.10中的g++下):

代码语言:javascript
复制
First:
Second:
Third:
copy constructor
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-13 09:11:52

这是由于返回值优化造成的复制省略。

编译器可以通过应用此类优化来优化生成的副本。

代码语言:javascript
复制
A a1=generateA(); 
A a2=A(0); 

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

代码语言:javascript
复制
A a3=a1;

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

编辑:在评论中回答Q。

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

GCC:

代码语言:javascript
复制
-fno-elide-constructors

适用于MVSC:

代码语言:javascript
复制
/Od
票数 6
EN

Stack Overflow用户

发布于 2012-03-13 09:12:15

  1. 复制构造函数不用于a1a2,因为在这两种情况下,您都传递一个int,因此编译器使用您定义的A(int)构造函数。
  2. 与书中的示例不同的是,书在堆栈上创建了一个实例(string()),因此得到了一个空副本,而在您的例子中,您使用的是一个现有实例(a1)。两者都在使用复制构造函数进行初始化。
票数 1
EN

Stack Overflow用户

发布于 2012-03-13 09:14:56

初始化a1时,有一个整数参数(在工厂函数中给出)。对于a2,您还传递一个整数。对于a3,你说a3=a1。这被解释为a3(a1),因为您定义了一个复制构造函数,因此调用它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9681050

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档