2017-12-12 11 views
1

以下のように複数のパラメータで演算子+オーバーロードを実行しています。複数のパラメータを持つオーバーロード演算子+でconst参照を渡す理由

#include <iostream> 
using namespace std; 
class Integer{ 
    int value; 
    public: 
     Integer(int i) {value=i;}; 
     int getValue() { return value;}; 
     friend Integer operator+ (Integer & a, Integer & b){ 
      Integer I (a.value+b.value); 
      return I; 
     }; 
}; 

int main() { 
    Integer a(1), b(2), c(3); 
    Integer d = a+b+c; 
    cout<<d.getValue()<<endl; 
    return 0; 
} 

"演算子+に一致しません"をコンパイルして返すことはできません。私は複数のパラメータ((a + b)+ c)のアルゴリズムを読んで理解しています。なぜそれは動作しません?

friend Integer operator+ (const Integer & a,const Integer & b){ 
    Integer I (a.value+b.value); 
    return I; 
}; 

そして

friend Integer & operator+ (Integer & a,Integer & b){ 
    Integer I (a.value+b.value); 
    return I; 
}; 

しかし、私はなぜ知らない: しかし、私はそれを動作させるには二つの方法を発見しました。ありがとうあなたの operator+署名で

+1

オーバーロードされた演算子の[canonical forms](http://en.cppreference.com/w/cpp/language/operators)をお読みください。それはすべて明確に定義されており、十分に文書化されています。 – Useless

答えて

8

ルック:

friend Integer operator+ (Integer & a, Integer & b) 
//      ^^^^^^^^^ ^^^^^^^^^ 

ab左辺値参照です。


あなたは

Integer d = a+b+c; 

a+bを書くInteger&に結合しないタイプInteger右辺値を生産しています。


const左辺値参照としてconst Integer &作品とのバージョンが左辺値右辺値の両方に結合することができます。

0

まずその一時オブジェクトとcoperator +を呼び出し、一時的Integerオブジェクトを生成するaboperator +を呼び出すa+b+c;を実行します。テンポラリオブジェクトはconst修飾されていないオブジェクトへの参照として渡すことができないため、operator +を2回目に呼び出すことはできません。

非const参照を受け入れるようにoperator +を宣言することは、オブジェクトパスが変更されていないためとにかく意味がありません。

関連する問題