c++ - 在复制构造函数中使用和不使用 const 有什么区别?

c++ - What is the difference between using and not using const in Copy Constructor?

提问人:doubleU 提问时间:6/12/2017 最后编辑:πάντα ῥεῖdoubleU 更新时间:6/12/2017 访问量:66

问:

此代码有错误。

[Error] no matching function for call to Complex::Complex(Complex)

但是当这段代码写出来时,Complex(const Complex & newComplex)

只需使用 const,此代码即可正常工作。

为什么??我不知道为什么。请告诉我答案。

#include <iostream>
using namespace std;

class Complex {
    double re, im;
public:
    Complex(double _re = 0, double _im = 0): re(_re), im(_im) {}
    Complex(Complex & newComplex) {
        re = newComplex.re;
        im = newComplex.im;
    }
     ~Complex() {}
    Complex operator + (Complex & inputComplex) {
        Complex tempComplex;
        tempComplex.re = re + inputComplex.re;
        tempComplex.im = im + inputComplex.im;
    return tempComplex;
    }
};

int main()
{
    Complex c1(1, 0), c2(2, 1);
    Complex c3(c1 + c2);
}
C++ 运算符重载 常量 复制构造函数

评论


答:

0赞 Adam Hunyadi 6/12/2017 #1

当 Const 引用被传递给 (基本上是一个临时对象) 时,它们的行为与普通引用不同。rvalue

将引用绑定到临时对象时,它会延长临时对象的生存期,并将其纳入引用的作用域。非常量引用无法做到这一点,因此构造函数不会接受(其返回类型是临时对象)作为其参数。constc1 + c2

0赞 Jerry Coffin 6/12/2017 #2

类型的参数是左值引用。左值引用必须引用左值(临时对象不是左值)。T &

临时对象(例如 you get from )不是左值,因此对 (non-const) T 的引用不能绑定到它。c1+c2

尽管它仍然是对左值的引用,但允许对 const T(即 a 或 )的引用绑定到临时对象。T const &const T &

在某些情况下(但可能不是这种情况),您可能需要考虑使用使用右值引用的移动构造函数。这样,新对象就可以“窃取”临时对象的内容,而不是复制它。对于字符串或向量之类的内容,它特别有用,这些内容可能具有对象拥有的大量动态分配内存,但只需复制指针而不是所有数据即可从一个对象移动到另一个对象。