0

こんにちは、このようなコードがあります。友人のオーバーロードされた演算子と変換演算子の両方に同様の機能があると思います。しかし、なぜこの場合にフレンドのオーバーロードされた演算子が呼び出されるのでしょうか? ルールは何ですか?

本当にありがとう!

class A{

    double i;
public:
    A(int i):i(i) {}
    operator double () const { cout<<"conversion operator"<<endl;return i;}                            // a conversion operator
    friend bool operator>(int i, A  a);                            // a friend funcion of operator >
};

bool operator>(int i, A  a ){
    cout<<"Friend"<<endl;
    return i>a.i;
}
int main()
{
    A  aa(1);
     if (0 > aa){
         return 1;
      }
}
4

4 に答える 4

4

オーバーロードを呼び出すために変換は必要ありませんoperator>。ビルトインをoperator>呼び出すには、1 つの変換が必要です (ユーザー定義の変換演算子。オーバーロードの解決では、必要な変換が少ないオプションが優先されるため、オーバーロードoperator>されたものが使用されます。

オーバーロードの定義を次のように変更する場合は、次のように注意してくださいoperator>

friend bool operator>(double i, A  a);

operator>オーバーロードされたものとビルトインの両方operator>が 1 つの変換を必要とし、コンパイラがあいまいさを解決できないため、コンパイル エラーが発生します。

于 2010-03-13T18:16:48.953 に答える
1

私の答えが標準によってサポートされていると主張しているわけではありませんが、論理的に考えてみましょう。

この行にヒットすると:

0 > aa

2 つのオプションがあります。提供されたオペレーターを呼び出すか、次のいずれかを行います。

friend bool operator>(int i, A  a);

これは 100% 互換性があり、目的地に到達するために 2 回の変換を行うことができます! あなたならどちらを選びますか?

于 2010-03-13T18:14:30.283 に答える
0

変換演算子を追加すると、タイプ A のオブジェクトは、予期しないときに double に変換される場合があります。

優れたプログラムは、彼のクラスが誤って使用される方法を提供せず、変換演算子は、意図しない多くの状況でクラスが使用される可能性を開きます (通常、コンパイル時エラーが予想される状況は、自動型変換の)。

結果として、変換演算子 (および単一引数コンストラクター) は、予期しないときにコンパイラーが変換を実行する可能性があるため、注意して扱う必要があります。

于 2010-03-13T18:29:56.867 に答える