2

我不明白为什么我们需要一个复制构造函数(从..开始),特别是为了引用成员。

给定一个类

Foo类{对象(&O);};

我现在必须编写一个复制构造函数并=操作符(可能还有其他5个秘密内容),否则它将无法编译。为什么?为什么编译器能够确定它应该复制整数一串但不是参考?指针也一样吗?它认为我可能想做什么?我必须准确地写出编译器为每个其他属性所写的内容。如果我向类中添加了一个新属性,或者更糟糕的是,其他人向类中增加了一个属性,但忘记将其添加到copy ctor和operator中,该怎么办?

15
  • 2
    默认情况下,编译器执行浅层复制。如果你不知道浅拷贝和深拷贝之间的区别,那将是首先要问的问题。这也有助于回答为什么我们需要复制构造函数。
    – 瑞典语
    评论 2020年8月12日15:08
  • 当它在运行时编译并崩溃时,情况会更糟。有了编译器错误,您就知道有问题了。如果出现运行时错误,你最好祈祷在机组人员发现之前找到它。 评论 2020年8月12日15:17
  • @瑞典语浅显的复制点在引用时是没有意义的。 评论 2020年8月12日15:19
  • 1
    假设引用被初始化为指向类的另一个成员。当复制的实例时,编译器生成的复制构造函数将,使副本中的引用引用原始对象的成员,而不是它自己的相应成员。如果这不是期望的行为,则需要手动复制构造函数。
    – 彼得
    评论 2020年8月12日15:20
  • 1
    还要记住,不能重新分配引用。 评论 2020年8月12日15:21

1答案1

重置为默认值
4

简单的回答是:因为C++标准就是这么说的。但这不是一个很有趣的答案。

要得到一个更有趣的答案,我们可以问一个不同的问题:这种行为的理由是什么?

虽然我并不声称知道这个问题的规范答案,但如果这只是为了减少混乱,我也不会感到惊讶。作为成员的引用可能会出现意外行为,使用它们复制类可能会产生您不期望的结果。

从技术上讲,没有什么可以阻止编译器将引用的成员从源复制到目标。但很多人会期望类“重新指向”引用(类似于指针)。但引用不能被重新绘制,其基本原理在“C++的设计和演化”中给出:

Stroustrup的“C++的设计和进化”中给出了C++不允许重新绑定引用的原因:

…我过去曾被Algol68中r1=r2的引用所咬过可以通过r1赋值给引用的对象,也可以分配一个新的r1的参考值(重新绑定r1)取决于r2的类型。希望在C++中避免此类问题。

4
  • 是 啊。我想我只是想“到2020年了,为什么现在它应该知道我想要什么了,我们还必须手动键入……”比如,不是吗?设计者难道不知道我们都确切地知道复制ctor和=运算符想要做什么吗?我们都知道!!所以为我们做吧!这让我感到焦虑,因为其他人或我自己最终会忘记复制班上的新成员!!!人们在修改代码时根本不会阅读你的代码。。 评论 2020年8月12日15:39
  • 1
    @坦克_____坦克,但编译器如何知道你想要什么?编译器知道这一点的唯一方法是在编写复制代码时! 评论 2020年8月12日15:45
  • 我不知道!哈哈。它应该知道。我知道这很酷,我们可以把内存管理到地址级别。但是如果我们可以只写一些代码,做我们想做的,而不是用模糊的方式取悦编译器或语言,那会怎么样呢。但我梦想。。 评论 2020年8月12日15:54
  • 我正在等待在C++79中添加心灵感应编译器扩展。 评论 2020年8月12日16:38

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.