可以将对象作为值传递给复制构造函数

时间:2010-12-08 19:18:22

标签: c++

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

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

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

6 个答案:

答案 0 :(得分:12)

这是因为为了传递值,您需要 COPY 该对象。因此,您正在传递对象的副本,在如何复制它的定义中。

如果不存在此陷阱,实际上会发生什么情况,您的复制构造函数将调用您的复制构造函数来创建一个副本,该副本将调用您的复制构造函数来创建一个副本,该副本将调用您的复制构造函数来创建副本, ...

答案 1 :(得分:5)

没有

如错误所示,它将导致复制构造函数的递归调用。复制构造函数用于复制对象。您需要在按值传递对象时制作对象的副本。

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

答案 2 :(得分:5)

标准明确指出(12.1 / 10构造函数):

  

类X的复制构造函数是一个构造函数,其第一个参数类型为X&或类型为const X&

因此它不能采用值参数 - 它必须是参考。

如果你考虑一下,应该清楚为什么:要传递一个值参数,编译器必须复制...它需要调用复制构造函数来执行此操作。

答案 3 :(得分:4)

当参数由value给出时,编译器需要首先复制一个对象(按顺序创建将作为参数的实例)。因此,要调用复制构造函数,编译器需要提前复制该对象。

通常,复制构造函数以这样的方式定义:

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

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

答案 4 :(得分:1)

  

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

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

答案 5 :(得分:1)

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

然后你问:

  

然后为什么说“复制   构造函数将导致递归   使用pass by value时调用。“

标准没有规定诊断消息,而是您的编译器选择这些词来解释为什么它不可行。