【问题标题】:Can a object be passed as value to the copy constructor可以将对象作为值传递给复制构造函数吗
【发布时间】:2010-12-08 19:18:22
【问题描述】:

我对“可以将对象作为值传递给复制构造函数”有些困惑 编译器明确拒绝了这一点,这意味着这是不可能的。 你能帮我理解这个吗?

class Dummy{
    Dummy(Dummy dummy){ // This is not possible
    }
};

那为什么说“使用传值传递时复制构造函数会导致递归调用”

【问题讨论】:

  • @Kos - 我不同意。人们应该接受正确的答案,而不是他们最喜欢的答案。
  • 好点! :-) 那应该是“你最喜欢的正确答案”。
  • 好吧,我不是专家来判断哪个是正确答案。然而,吸引我的最有可能是被选为正确的那个。

标签: c++


【解决方案1】:

这是因为为了按值传递,您需要COPY 对象。因此,你是传入一个对象的副本,在定义如何复制它。

如果这个陷阱不存在,实际上会发生什么,你的复制构造函数会调用你的复制构造函数来创建一个副本,它会调用你的复制构造函数来创建一个副本,它会调用你的复制构造函数来创建一个副本, ...

【讨论】:

  • 但是编译器似乎不允许按值传递作为 Ctor 的参数,然后 COPYing 就出现了。仍然无法得到这个。
  • @Zuzu:这就是为什么你不能有一个按值获取参数的复制构造函数:由于这种无限递归,不可能调用。
  • @Zuzu:如果它被允许,那么就会有递归。为了防止这种假设的递归,它是不允许的。
【解决方案2】:

没有。

正如错误所说,它会导致复制构造函数的递归调用。复制构造函数用于复制对象。当按值传递对象时,您需要对其进行复制。

因此,如果您可以拥有这样的构造函数,则需要调用复制构造函数来复制您传递给复制构造函数的对象,直到无限期。

【讨论】:

    【解决方案3】:

    标准中特别提到(12.1/10 Constructors):

    类 X 的复制构造函数是具有 X& 类型或 const X& 类型的第一个参数的构造函数

    所以它不能带值参数——它必须是一个引用。

    如果你想一下 if ,应该很清楚为什么:要传递一个值参数,编译器必须进行复制......它需要调用复制构造函数来这样做。

    【讨论】:

    • 你能用一个例子帮助我理解吗
    • 也许orangeoctopus的回答中的例子可能有助于你理解。
    【解决方案4】:

    当参数由值给出时,编译器需要首先复制一个对象(以便创建将作为参数的实例)。因此,要调用您的复制构造函数,编译器需要提前制作对象的副本。

    通常复制构造函数是这样定义的:

    Dummy(const Dummy& dummy)
    {
        // This is possible
    }
    

    这样,您无需为构造函数请求对象的单独副本,您只需提供对现有副本的引用(并保证也不更改该副本)。

    【讨论】:

      【解决方案5】:

      那为什么说“使用传值时复制构造函数会导致递归调用”

      因为要将对象按值传递给该复制构造函数,您可能需要先复制构造它(因为按值传递的参数是传递的原始对象的临时副本)。

      【讨论】:

        【解决方案6】:

        虽然已经给出了答案,但我只是想澄清一下,因为我看到相同的问题重复出现。 Dummy(Dummy dummy); 不是复制构造函数。复制构造函数的形式可以是Dummy(const Dummy&);Dummy(Dummy&);,标准明确禁止原始构造函数。

        那么你在问:

        那为什么说“复制 构造函数会导致递归 使用传值时调用。"

        诊断信息不是标准强制要求的,而是您的编译器选择了这些词来解释它为什么不能工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-12
          • 2011-06-12
          • 2020-07-27
          • 1970-01-01
          • 2018-08-04
          相关资源
          最近更新 更多