2016-11-03 11 views
9
class A { 
public: 
    string operator+(const A& rhs) { 
     return "this and A&"; 
    } 
}; 

string operator+(const A& lhs, const A& rhs) { 
    return "A& and A&"; 
} 

string operator-(const A& lhs, const A& rhs) { 
    return "A& and A&"; 
} 

int main() { 
    A a; 
    cout << "a+a = " << a + a << endl; 
    cout << "a-a = " << a - a << endl; 
    return 0; 
} 

//output 
a+a = this and A& 
a-a = A& and A& 

なぜ、クラス内の演算子が外部のものではなく呼び出されるようになっているのが好奇妙です。事業者間に何らかの優先順位がありますか?クラス内の演算子はどのように機能しますか?

+4

同じ名前のいくつかの関数の中から選択するプロセスは、* overload resolution *と呼ばれます。このコードでは、非メンバは修飾変換( 'lhs'に' const 'を追加する)を必要とするがメンバは修飾しないため、メンバが優先されます。メンバ関数 'const'を作成した場合(これは' * this'を変更しないので)、曖昧になります –

答えて

4

は、内側のように定義されたときに何が起こるかを参照してください。このコードでは、非メンバが資格変換(constlhsを追加する)を必要とするがメンバは修飾しないため、メンバが優先されます。メンバー関数const(これは変更されていないので、*this)を作成した場合はあいまいです。

1

あなたのオブジェクトが非constであるときはいつも、constよりも非constの優先順位があります。左辺がconstでないときはinner、右辺がconstのときはouterが呼び出されます。同じ名前の複数の関数の間で選択するプロセスは、オーバーロードの解決と呼ばれる

string operator+(const A& rhs) const;

+1

"constよりも非constの優先順位があります。"一般的なケースではありません。 'a'が' constAa; 'として宣言されていた場合、クラス外のオーバーロードが使用されます。 – Angew

+0

それは私が書いたものです。 – Shloim

+1

答えが書かれている方法は、「c​​onstの上に非constの優先順位があります」という一般的な声明のように聞こえます。どちらが間違っているのでしょうか。 – Angew

関連する問題