19

可能重复:
为什么复制构造函数应该在C++中通过引用接受其参数?
对象能否作为值传递给复制构造函数

考虑这段代码:

类复合体{私人:双re,im;公众:复数(double _re,double _ im):re(_re),im(_im){}复合物(复合物c):re(c.re),im(c.im){}};

编译时,我收到一条错误消息:无效构造函数;你可能指的是“复杂(常数复杂&)”

在书中C++编程语言,特此声明:

复制构造函数定义了复制意味着什么——包括什么复制论点意味着——所以写作

复杂:复杂(复杂c):re(c.re),im(c.im){}//错误

是一个错误,因为任何调用都会涉及无限递归。

为什么这会导致无限递归?这没有道理。

0

3个答案

重置为默认值
44

通过值表示参数为已复制进入函数。它调用复制构造函数。

如果复制构造函数参数是pass-by-value。。。它会称自己为。。。一遍又一遍。。。

4
  • 所以我有另一个问题:哪个是正确的复制构造函数?我知道常量引用是正确的,但如果是正确的引用,编译器不应该排除通过值的情况,因为它不是正确的签名,因此不应该发生递归吗?
    – 阿穆姆
    评论 2011年12月8日19:37
  • 你能澄清一下你所说的“排除通过价值传递的情况”是什么意思吗?
    – 神秘的
    评论 2011年12月8日19:41
  • 这意味着它应该只选择const引用作为复制的函数。其他一切都被排除在外。为什么它在这里应用带传递值的函数?或者两者都是复制构造函数,只是传递值不能修改,并且用于传递给其他函数而不是其构造函数?
    – 阿穆姆
    评论 2011年12月8日19:44
  • 啊,我想我明白你的意思了。你是说如果你有两个重载构造函数:复数(复数c)复数(const复数&c)……这是一个有趣的角落案例,我不确定。
    – 神秘的
    评论 2011年12月8日19:46
10

通过值传递(而不是通过引用传递)意味着需要制作副本。因此,通过值传递到复制构造函数意味着您需要在调用复制构造函数之前进行复制,但要使首先需要调用copy构造函数.

2

当函数与参数一起传递时,将创建与参数对应的局部变量,并与传递给函数调用的参数一起复制。因此,当调用函数时,将调用函数的复制构造函数,将传递给调用的参数复制到创建的局部变量。这将导致无休止的循环。

当引用传递给函数时,不会创建与参数对应的局部变量。

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