提问人:doubleU 提问时间:6/12/2017 最后编辑:πάντα ῥεῖdoubleU 更新时间:6/12/2017 访问量:66
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);
}
答:
0赞
Adam Hunyadi
6/12/2017
#1
当 Const 引用被传递给 (基本上是一个临时对象) 时,它们的行为与普通引用不同。rvalue
将引用绑定到临时对象时,它会延长临时对象的生存期,并将其纳入引用的作用域。非常量引用无法做到这一点,因此构造函数不会接受(其返回类型是临时对象)作为其参数。const
c1 + c2
0赞
Jerry Coffin
6/12/2017
#2
类型的参数是左值引用。左值引用必须引用左值(临时对象不是左值)。T &
临时对象(例如 you get from )不是左值,因此对 (non-const) T 的引用不能绑定到它。c1+c2
尽管它仍然是对左值的引用,但允许对 const T(即 a 或 )的引用绑定到临时对象。T const &
const T &
在某些情况下(但可能不是这种情况),您可能需要考虑使用使用右值引用的移动构造函数。这样,新对象就可以“窃取”临时对象的内容,而不是复制它。对于字符串或向量之类的内容,它特别有用,这些内容可能具有对象拥有的大量动态分配内存,但只需复制指针而不是所有数据即可从一个对象移动到另一个对象。
评论