2017-06-11 23 views
-1

このコードにはエラーがあります。C++ - コピーコンストラクタでconstを使用する場合と使用しない場合の違いは何ですか?

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

しかし、このコードはComplex(const Complex & newComplex)

はただのconstを使用することを書くとき、このコードは正常に動作します。

なぜですか?どうしてか分かりません。答えを教えてください。彼らはrvalue(基本的には一時的なオブジェクト)を渡された場合

#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

のConst参照は、通常の参照とは動作が異なります。

constの参照を一時オブジェクトにバインドすると、一時的なオブジェクトの存続期間が延長され、参照のスコープに持ち込まれます。非const参照はこれを行うことができないので、コンストラクタは(戻り値の型が一時オブジェクトである)c1 + c2を引数として受け付けません。

0

タイプT &のパラメータは左辺値です。左辺値参照は左辺値を参照する必要があります(一時オブジェクトは左辺値ではありません)。

一時オブジェクト(例えば、c1+c2から取得)は左辺値ではないため、(非const)Tへの参照はバインドできません。

まだ左辺値を参照していますが、const T(つまりT const &またはconst T &)への参照は一時オブジェクトにバインドできます。

状況によっては(おそらくこの場合はそうでないかもしれませんが)、代わりにrvalue参照を使用するmoveコンストラクタを使用することを検討してください。これにより、新しいオブジェクトは一時オブジェクトの内容をコピーするのではなく、「盗む」ことができます。これは、文字列やベクトルのようなもので、オブジェクトが所有する動的に割り当てられたメモリが大量にありますが、すべてのデータではなくポインタをコピーするだけでオブジェクト間で移動できます。

関連する問題