为什么这段代码会调用复制构造函数?

时间:2013-12-18 15:53:02

标签: c++ copy-constructor

我是一个C ++ noob所以我无法弄清楚为什么Logger.cpp中的行会调用复制构造函数...

Logger.h:

class Logger {
    public:
    Logger();
    ~Logger();
};

Logger LOGGER;

Logger.cpp:

Logger LOGGER = Logger(); // Copy constructor here

4 个答案:

答案 0 :(得分:10)

语句Logger()创建一个匿名临时对象。

LOGGER = Logger()将匿名临时副本复制到对象LOGGER中。副本构造函数避免必须将LOGGER构造为除临时副本之外的其他内容。

允许编译器优化掉该副本,但不需要。更多here.

如果您想直接构建对象,只需说出Logger LOGGER;

答案 1 :(得分:3)

在语句Logger LOGGER = Logger();中使用了复制构造函数。

最初看起来很令人惊讶:您认为使用了赋值运算符。但是这种语言不起作用。原因很微妙:使用赋值运算符预先假定存在应该进行赋值的对象。这将需要默认构造,这将是次优的。

答案 2 :(得分:0)

没有足够的代码可以得出一些结论。目前尚不清楚标题和模块中的LOGGER是在同一声明区域还是在不同的声明区域中定义的。在任何情况下,编译器都应发出错误,或者这两个定义定义不同的对象,例如因为它们位于不同的声明区域中。

答案 3 :(得分:-1)

“记录器();”返回一个对象,然后调用赋值运算符,它调用复制构造函数。先前的LOGGER对象作为参数传递。