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

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

这段代码有错误。

[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);
}

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

当您将 const 引用绑定到临时对象时,它会延长临时对象的生命周期并将其置于引用的范围内。非常量引用不能这样做,所以你的构造函数不会接受 c1 + c2 (它的 return 类型是一个临时对象)作为它的参数。

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

临时对象(例如您从 c1+c2 获得的对象)不是左值,因此对(非常量)T 的引用不能绑定到它。

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

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