c ++ - 在Copy Constructor中使用和不使用const有什么区别?

时间:2017-06-11 18:12:10

标签: c++ operator-overloading const 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);
}

2 个答案:

答案 0 :(得分:0)

当const引用传递$var_display = $_POST['display']; $iterator = 0; foreach ($var_display as $it) { $iterator += 1; echo ' <span class="ui fluid large label">Range</span> <div class="ui divider"></div> <form class="ui form"> <div class="field"> <div class="fields"> <div class="twelve wide field"> <div class="ui blue range" id=#range-'.$iterator.'></div> </div> <div class="four wide field"> <div class="ui input"><input type="text" id="input-'.$iterator.'"></div> </div> </div> </div> </form> <div class="ui divider"></div> '; } (基本上是临时对象)时,它的行为与普通引用不同。

$(document).ready(function(){ for (var i = 0; i < 40; i++) { $('#range-'+i).range({ min: 0, max: 10, start: 5, input: '#input-'+i }); } }); 引用绑定到临时对象时,它会延长临时对象的生命周期并将其带到引用范围。非const引用不能这样做,因此构造函数不会接受rvalue(其返回类型是临时对象)作为其参数。

答案 1 :(得分:0)

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

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

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

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