我对此有一些困惑“可以将对象作为值传递给复制构造函数” 编译器明确拒绝这一点,这意味着它是不可能的。 你能帮我理解一下吗?
class Dummy{
Dummy(Dummy dummy){ // This is not possible
}
};
那么为什么说“复制构造函数会在使用值传递时导致递归调用。”
答案 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时调用。“
标准没有规定诊断消息,而是您的编译器选择这些词来解释为什么它不可行。