私はC++で学んだことのすべて(それほどではない)の中で、演算子のオーバーロードは最も難しいようです。一般的に言えば、演算子オーバーロードをフレンド関数として書くのが最善でしょうか?私はいつ具体的に使用する必要があります*this
?一時オブジェクトを使うのはいつも悪いですか?演算子のオーバーロードを実装する最善の方法は何ですか?
答えて
ニールの答えは正しいです。さらに、this linkは、C++でさまざまなタイプの演算子のオーバーロードをいつ、どこで、なぜ、どのように使用するかについて、多くの優れた情報を提供します。
一般に、私は直感的な過負荷に固執しようとします - '+'演算子の使用は加算などと類似したものを反映する必要があります。そのようなものであれば、代わりに標準関数を使用しているはずです。
魔法のabourt演算子のオーバーロードはありません。そのようなオーバーロードは、単に変な名前の関数です。したがって、名前付き関数を作成するのと同じ方法で演算子のオーバーロードを記述します。実際、名前付き関数を最初に書くのは良い考えです。後でいつでも演算子に変更することができます。あなたが知っておく必要はあります
唯一のものは、コンパイラがあなたの事業者のカップルを使用することです:
- 演算子=()コレクションで物事を格納するとき
- オペレータ<()ソート/検索するとき
演算子のオーバーロードの第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参照を待ちます。
constを返さないでください。 –
すべての演算子はlvalueとして* thisを取ります。したがって、このようなオーバーロードストリーム演算子を望ましくない場合は、< <と>>のような友人が必要です。最低限の特権の原則を破る。 オペレータを過負荷にする他の方法は、言われていなかったが、グローバル関数を使用することです。
- 1. オーバーロードする必要のある最小限の演算子は何ですか?
- 2. 演算子のオーバーロードのラップ方法
- 3. C++オーバーロード:[] []演算子のオーバーロード
- 4. PerlでAPL圧縮演算子を実装する最良の方法は何ですか?
- 5. 演算子のオーバーロード
- 6. 演算子オーバーロード==
- 7. C++:演算子オーバーロード、演算子+
- 8. C++演算子+演算子+ =オーバーロード
- 9. C:++で演算子のオーバーロード「:=」
- 10. オーバーロード比較です演算子「無効な演算子は、<」
- 11. ネストされたクラスの演算子をオーバーロードする方法は?
- 12. DelphiでInc(Dec)演算子をオーバーロードする方法は?
- 13. Javascriptでトランスペアラを使用して演算子のオーバーロードを実装する
- 14. DLRで三項演算子を実装する方法
- 15. MySQLで三項条件演算子を実装する方法
- 16. ポストインクリメント演算子オーバーロード
- 17. 演算子オーバーロード+ BinaryTree
- 18. C++の演算子のオーバーロード
- 19. オーバーロード算術演算子
- 20. ストリーム挿入演算子にテンプレートをオーバーロードする方法は?
- 21. AJAXの「スライダ」を実装する最善の方法は何ですか?
- 22. ASP.NET MVCでユーザーコントロールを実装する最善の方法は何ですか?
- 23. C++でハッシュローテーションメソッドを実装する最善の方法は何ですか?
- 24. テンプレートクラスのバイナリ演算子オーバーロード
- 25. C#のオーバーロード演算子==クラス
- 26. オーバーロード! Rubyの演算子
- 27. + =イベント演算子のオーバーロード
- 28. 演算子のオーバーロード+ OBJ
- 29. constexpr演算子オーバーロードのガイドライン?
- 30. マニピュレータの演算子オーバーロード
多くのライブラリでは、関数オブジェクトの処理にoperator()も使用されています –
実際、演算子==は他人によって使用されていますが、初心者を圧倒したくありませんでした。 –