我是一个C ++ noob所以我无法弄清楚为什么Logger.cpp中的行会调用复制构造函数...
Logger.h:
class Logger {
public:
Logger();
~Logger();
};
Logger LOGGER;
Logger.cpp:
Logger LOGGER = Logger(); // Copy constructor here
答案 0 :(得分:10)
语句Logger()
创建一个匿名临时对象。
LOGGER = Logger()
将匿名临时副本复制到对象LOGGER
中。副本构造函数避免必须将LOGGER
构造为除临时副本之外的其他内容。
允许编译器优化掉该副本,但不需要。更多here.
如果您想直接构建对象,只需说出Logger LOGGER;
。
答案 1 :(得分:3)
在语句Logger LOGGER = Logger();
中使用了复制构造函数。
最初看起来很令人惊讶:您认为使用了赋值运算符。但是这种语言不起作用。原因很微妙:使用赋值运算符预先假定存在应该进行赋值的对象。这将需要默认构造,这将是次优的。
答案 2 :(得分:0)
没有足够的代码可以得出一些结论。目前尚不清楚标题和模块中的LOGGER是在同一声明区域还是在不同的声明区域中定义的。在任何情况下,编译器都应发出错误,或者这两个定义定义不同的对象,例如因为它们位于不同的声明区域中。
答案 3 :(得分:-1)
“记录器();”返回一个对象,然后调用赋值运算符,它调用复制构造函数。先前的LOGGER对象作为参数传递。