首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >构造函数还是复制构造函数?

构造函数还是复制构造函数?
EN

Stack Overflow用户
提问于 2011-08-25 12:05:32
回答 3查看 348关注 0票数 8

在“通用编程和STL (中文版)”一书中,它写道:

X x = X()将调用复制构造函数。

我觉得有点奇怪。我写了一个这样的测试程序

代码语言:javascript
复制
#include <iostream>

class Test {

public:

    Test() {
        std::cout << "This is ctor\n";
    }

    Test(const Test&) {
        std::cout << "This is copy-ctor\n";
    }

};

int main(int argc, char** argv)
{

    Test t = Test();
    return 0;
}

输出是“这是ctor”。好吧,现在我糊涂了,对不对?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-25 12:08:01

当然,临时构造是默认的,然后调用复制构造函数将其复制到对象t中。

然而,在实践中,可以优化副本--尽管它有副作用(控制台输出):

[n3290: 8.5/16]:..在某些情况下,通过将中间结果直接构造到被初始化的对象中,允许实现消除这种直接初始化过程中固有的复制;参见12.2,12.8。

和(结合同一条款中的例子):

[n3290: 12.2/2]:..在使用X的复制构造函数将X(2)传递给f()之前,实现可能使用临时构造器构造X(2);或者,可以在容纳参数的空间中构造X(2)。。。

但是复制构造函数仍然必须存在,即使它可能不会被调用。

无论如何,如果在关闭优化(或者使用GCC,可能是-fno-elide-constructors)的情况下编译,您将看到:

代码语言:javascript
复制
This is ctor
This is copy-ctor
票数 9
EN

Stack Overflow用户

发布于 2011-08-25 12:08:09

理论上,X x = X()将调用默认构造函数来创建一个临时对象,并使用复制构造函数将其复制到x中。

实际上,编译器可以直接跳过复制构造部分和默认构造x (正如David在他的注释中指出的那样,这仍然要求复制构造函数在语法上是可访问的)。至少在启用优化时,大多数编译器都会这样做。

票数 4
EN

Stack Overflow用户

发布于 2011-08-25 12:09:00

在这种情况下,一种形式的返回值优化(RVO) (也称为复制省略)可以在优化方面提供很大帮助。维基百科的链接对正在发生的事情有很好的解释。

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

https://stackoverflow.com/questions/7190026

复制
相关文章

相似问题

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