2012-04-25 4 views
1

可能性の重複:
Operator overloading
Operator overloading : member function vs. non-member function?オペレータをメンバー関数としてオーバーロードするのはなぜ賢明ではありませんか?

どうやらこれを乱用の多くの年後に誰かを構築し、これは悪い習慣であることを私に指摘:

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

のに対し、これは良い習慣です:

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

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

+1

参照してくださいhttp://stackoverflow.com/questions/4622330/operator-overloading-member-function-vs-non-member-function – dirkgently

+0

ありがとう、私は具体的に比較演算子を検索していたと思います。 – smocking

+1

[メンバーと非会員の決定](http://stackoverflow.com/questions/4421706/operator-overloading/4421729#4421729) –

答えて

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 
} 

ここでの主な違いは、暗黙的な変換であり、あなたのタイプは、暗黙のうちに他のタイプから変換することができます場合にのみ、それが違いを作ることに注意してください。あなたのタイプに暗黙的な変換がない場合、この点は疑問ですが、フリー関数を使用する上で不都合はなく、場合によっては利点があると考えて、可能な限りフリー関数を使用します。

オペレータオーバーロードhereについて少し前から書いてありましたが、そこにいくつかの提案があります。

+0

私は暗黙的な変換をいくつかの状況では不利な点としてカウントします(しかし、再度、明示的なコンストラクタを持つことによって、最初にこれを防止しようとします)。あなたのタイプが別の数値タイプの場合、暗黙の変換はおそらくOKですが、他のタイプの場合はケースバイケースで検討する必要があります。 –

+0

@ LokiAstari:暗黙的な変換は避けなければならないと約束しましたが、操作がある場合は、操作の左右で異なった動作をする意味がありません。つまり、暗黙的な変換の問題は、そのうちの1つでは、一貫しています。私が言うように、自由な機能を持たせることは決して傷つきませんし、場合によっては暗黙の変換が必要な場合に役立ちます。 –

+0

対称性とクラスカプセル化について話していたものがいくつかありましたが、暗黙的な変換は実際の実用上の利点であると思います。最近、SOのメンバー以外のオペレータの過負荷について聞いただけで、メンバーのオペレーターは、「悪い練習」として却下されたことに驚いていました。特に、それが私が知っていた唯一の方法だったからです私のコード全体で何年もそれを使用していました。私が恐れるほど悪くないことが分かりました。 – smocking

関連する問題