0

这里有理论上的疑问。阅读一本书,并给出以下声明:StringBad metoo = knot;其中:

  • StringBad 是一个类
  • 结是该类的对象

作者对复制构造函数说了以下内容:

实现可以选择分两步处理此语句:使用复制构造函数创建临时对象,然后使用赋值将值复制到新对象。也就是说,初始化总是调用复制构造函数,并使用 = 运算符形成也可以调用赋值运算符。

我的实现一步完成:

  • 使用复制构造函数创建 metoo 对象,与 this 相同:StringBad metoo(knot);

我可以理解其他实现可以通过如下两个步骤来完成:

  • 使用默认构造函数创建一个 metoo 对象,例如:StringBad metoo;
  • 使用重载赋值运算符将节点对象分配给metoo 对象。

但是作者说初始化总是调用复制构造函数。那是对的吗?如果是这样,编译器在某些实现中将遵循哪些步骤以分两步完成?我无法在我的事业中对其进行测试,正如我所说的那样,它是一步完成的。

4

1 回答 1

2

作者错了。您所拥有的是带有复制初始化的声明语句,而实现这一点的唯一方法是通过StringBad(StringBad const &)复制构造函数实例化一个新对象。*在这种情况下永远不会调用赋值运算符,甚至不需要存在或可访问。

There is almost no difference between the two variants StringBad metoo = knot; and StringBad metoo(knot);.

*) or the non-const version if that happens to exist and match.

于 2012-08-18T11:59:13.320 回答