2009-04-22 16 views
2

私はC++で学んだことのすべて(それほどではない)の中で、演算子のオーバーロードは最も難しいようです。一般的に言えば、演算子オーバーロードをフレンド関数として書くのが最善でしょうか?私はいつ具体的に使用する必要があります*this?一時オブジェクトを使うのはいつも悪いですか?演算子のオーバーロードを実装する最善の方法は何ですか?

答えて

2

ニールの答えは正しいです。さらに、this linkは、C++でさまざまなタイプの演算子のオーバーロードをいつ、どこで、なぜ、どのように使用するかについて、多くの優れた情報を提供します。

一般に、私は直感的な過負荷に固執しようとします - '+'演算子の使用は加算などと類似したものを反映する必要があります。そのようなものであれば、代わりに標準関数を使用しているはずです。

4

魔法のabourt演算子のオーバーロードはありません。そのようなオーバーロードは、単に変な名前の関数です。したがって、名前付き関数を作成するのと同じ方法で演算子のオーバーロードを記述します。実際、名前付き関数を最初に書くのは良い考えです。後でいつでも演算子に変更することができます。あなたが知っておく必要はあります

唯一のものは、コンパイラがあなたの事業者のカップルを使用することです:

  • 演算子=()コレクションで物事を格納するとき
  • オペレータ<()ソート/検索するとき
+0

多くのライブラリでは、関数オブジェクトの処理にoperator()も使用されています –

+0

実際、演算子==は他人によって使用されていますが、初心者を圧倒したくありませんでした。 –

1

演算子のオーバーロードの第1のルール:意味をなさない演算子をオーバーロードしません。例えば、+演算子はリストに要素を追加するための良い選択のように見えるかもしれませんが、そうではありません。

数値演算子については、friendは不要です。

(対称および暗黙的な変換を尊重)それらを定義する典型的な方法は、以下のいずれか:*=(T const&)オペレータのよう

struct T { 
    T& operator+=(T const& rhs) { 
     // the actual addition code 
     return *this; 
    } 
}; 
T const operator+(T const& lhs, T const& rhs) { 
    return T(lhs) += rhs; 
}; 

しかし、この組織はMatrix又は Polynomial乗算のような演算子に適合されていませんそれほど些細なことではない。その ケースでは、我々はoperator*(T const&, T const&)の上にoperator*=(T const&)を定義し、内部データへのアクセサが存在しない場合、バイナリoperator*()friend作ることができる - friendのこの使用は、カプセル化違反が、カプセル化強制ではありません - 、最適化の目的で使用することができます。

ほとんどの一時変数を削除したい場合は、式テンプレート(Blitz ++、boost.ublas、newmat ...を参照)を参照するか、C++ 0x rvalue参照を待ちます。

+0

constを返さないでください。 –

0

すべての演算子はlvalueとして* thisを取ります。したがって、このようなオーバーロードストリーム演算子を望ましくない場合は、< <と>>のような友人が必要です。最低限の特権の原則を破る。 オペレータを過負荷にする他の方法は、言われていなかったが、グローバル関数を使用することです。

関連する問題