1

重複の可能性:
演算子のオーバーロード
演算子のオーバーロード: メンバー関数と非メンバー関数?

何年にもわたってこの構造を明らかに悪用してきた後、誰かがこれは悪い習慣だと指摘しました。

class SomeClass
{
    ...
    bool operator<(const SomeClass& other) const;
};

これは良い習慣です:

class SomeClass
{
    ...
};
bool operator<(const SomeClass& a, const SomeClass& b);

しかし、私は一生理由を理解できず、違いに関するドキュメントを見つけることができません。誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

3

まず、演算子をメンバー関数として実装することには利点がなく、フリー関数として実装することには利点があります。特に、メンバー関数は2つのオペランドの型に関して対称ではありません。左側(lhs)は、呼び出されているクラスの正確な型である必要がありますが、右側はside(rhs)は暗黙の変換を使用できます。自由関数演算子の場合、同じ変換をlhsとrhsに適用できます。

struct SomeClass {
    SomeClass( int value );
    bool operator<( SomeClass const & ) const;
};
bool operator>( SomeClass const &, SomeClass const & );
int main() {
   SomeClass x( 10 );
   x < 100;             // Fine, lhs is SomeClass
   // 100 < x;          // Error, no operator< can take int as lhs and SomeClass
   x > 100;             // Fine
   100 > x;             // Also fine, lhs can take the same implicit conversions
}

ここでの主な違いは暗黙的な変換であり、それはあなたのタイプが他のタイプから暗黙的に変換できる場合にのみ違いを生むことに注意してください。タイプへの暗黙の変換がない場合、この点は重要ではありませんが、free関数を使用することに不利な点はなく、場合によっては利点があることを考慮して、可能な限りfree関数を使用します。

ここで演算子のオーバーロードについて少し前に書きましたが、そこにいくつかの提案があるかもしれません。

于 2012-04-25T04:24:27.383 に答える