タグ付けされた質問 「operator-overloading」

演算子のオーバーロードは、関係するオペランドのタイプに応じて演算子のカスタム実装を可能にするプログラミング言語の機能です。新しい演算子を定義できる言語もあれば、既存の演算子の再定義のみを許可する言語もあります。

7
演算子のオーバーロードの基本的なルールとイディオムは何ですか?
注:回答は特定の順序で与えられましたが、多くのユーザーは、与えられた時間ではなく投票に従って回答を並べ替えるため、最も意味のある順序で回答のインデックスを次に示します。 C ++での演算子のオーバーロードの一般的な構文 C ++での演算子オーバーロードの3つの基本ルール 会員と非会員の決定 オーバーロードする一般的な演算子 代入演算子 入出力演算子 関数呼び出し演算子 比較演算子 算術演算子 配列の添え字 ポインタのような型の演算子 変換演算子 新規および削除のオーバーロード (注:これは、Stack OverflowのC ++ FAQへのエントリになることを目的としています。このフォームでFAQを提供するという考えを批評したい場合は、これをすべて開始したメタへの投稿がそのための場所になります。回答その質問は、C ++チャットルームで監視されます。ここでは、FAQのアイデアが最初から始まっているため、アイデアを思いついた人があなたの答えを読む可能性が非常に高くなります。

16
なぜJavaは演算子のオーバーロードを提供しないのですか?
C ++からJavaに移行すると、未回答の明らかな質問は、なぜJavaに演算子のオーバーロードが含まれていないのかということです。 Complex a, b, c; a = b + c;よりもはるかに単純ではありませんComplex a, b, c; a = b.add(c);か? これの既知の理由はありますか?演算子のオーバーロードを許可しないための有効な引数はありますか?理由は恣意的ですか、それとも時間に遅れましたか?

10
Pretty-print C ++ STLコンテナ
この投稿の最後にある更新に注意してください。 更新:このライブラリ用にGitHubで公開プロジェクトを作成しました! 私は、すべてのSTLコンテナーをを介してきれいに印刷することをすべて一度に処理する単一のテンプレートが欲しいと思いoperator<<ます。疑似コードで、私はこのようなものを探しています: template<container C, class T, String delim = ", ", String open = "[", String close = "]"> std::ostream & operator<<(std::ostream & o, const C<T> & x) { o << open; // for (typename C::const_iterator i = x.begin(); i != x.end(); i++) /* Old-school */ for (auto i …

15
==と!=は相互に依存していますか?
私はC ++で演算子オーバーロードについて学んだ、と私はそれを見る==と!=、単純にユーザー定義型用にカスタマイズすることができますいくつかの特別な機能です。しかし、私の懸念は、なぜ2つの別個の定義が必要なのかということです。私があればと思ったa == b事実である場合、a != b定義によって、あるため、自動的に偽の、およびその逆で、かつ、他の可能性がないa != bです!(a == b)。そして、これが真実ではない状況を想像することはできませんでした。しかし、おそらく私の想像力は限られていますか、それとも私は何かについて無知ですか? もう1つの観点から1つを定義できることは知っていますが、これは私が求めていることではありません。また、値による比較や同一性によるオブジェクトの比較の違いについても質問していません。または、2つのオブジェクトが同時に等しいか等しくないかどうか(これは間違いなくオプションではありません!これらは相互に排他的です)。私が尋ねているのはこれです: 2つのオブジェクトが等しいことについて質問しても意味がないが、等しくないことについて質問しても意味がない状況はありますか?(ユーザーの観点から、または実装者の観点から) このような可能性がない場合、なぜC ++ではこれら2つの演算子が2つの異なる関数として定義されているのでしょうか。

8
C#で角かっこ演算子をオーバーロードするにはどうすればよいですか?
たとえば、DataGridViewを使用すると、次のことができます。 DataGridView dgv = ...; DataGridViewCell cell = dgv[1,5]; しかし、私の人生では、index / square-bracket演算子に関するドキュメントを見つけることができません。彼らはそれを何と呼びますか?どこに実装されていますか?投げられますか?自分のクラスで同じことをするにはどうすればよいですか? ETA:迅速な回答をありがとうございます。簡単に言うと、関連するドキュメントは "Item"プロパティの下にあります。オーバーロードする方法は、次のようなプロパティを宣言することですpublic object this[int x, int y]{ get{...}; set{...} }。少なくともドキュメントによると、DataGridViewのインデクサーはスローしません。無効な座標を指定するとどうなるかについては触れられていません。 ETA再度:OK、ドキュメントでは言及されていません(いたずらなMicrosoft!)が、無効な座標を指定すると、DataGridViewのインデクサーが実際にArgumentOutOfRangeExceptionをスローすることがわかります。公正警告。

5
ostreamの<<演算子を適切にオーバーロードする方法は?
行列演算のためにC ++で小さな行列ライブラリを書いています。しかし、私のコンパイラは文句を言いますが、以前はそうではありませんでした。このコードは6か月間棚に置いたままで、その間にコンピュータをdebian etchからlenny(g ++(Debian 4.3.2-1.1)4.3.2)にアップグレードしましたが、同じg ++のUbuntuシステムでも同じ問題があります。 これが私のマトリックスクラスの関連部分です: namespace Math { class Matrix { public: [...] friend std::ostream&amp; operator&lt;&lt; (std::ostream&amp; stream, const Matrix&amp; matrix); } } そして「実装」: using namespace Math; std::ostream&amp; Matrix::operator &lt;&lt;(std::ostream&amp; stream, const Matrix&amp; matrix) { [...] } これはコンパイラーによって与えられたエラーです: matrix.cpp:459:エラー: 'std :: ostream&Math :: Matrix :: operator &lt;&lt;(std :: …




6
C#拡張メソッドによる演算子のオーバーロード
拡張メソッドを使用して、C#StringBuilderクラスに演算子オーバーロードを追加しようとしています。具体的には、を指定するとStringBuilder sb、sb += "text"と同等になりたいと思いsb.Append("text")ます。 の拡張メソッドを作成するための構文は次のとおりですStringBuilder。 public static class sbExtensions { public static StringBuilder blah(this StringBuilder sb) { return sb; } } blah拡張メソッドがに正常に追加されますStringBuilder。 残念ながら、演算子のオーバーロードは機能していないようです: public static class sbExtensions { public static StringBuilder operator +(this StringBuilder sb, string s) { return sb.Append(s); } } 他の問題の中で、キーワードthisはこのコンテキストでは許可されていません。 拡張メソッドを介して演算子のオーバーロードを追加することは可能ですか?もしそうなら、それについて行く適切な方法は何ですか?

5
operator&がオーバーロードされているときに、オブジェクトのアドレスを確実に取得するにはどうすればよいですか?
次のプログラムを検討してください。 struct ghost { // ghosts like to pretend that they don't exist ghost* operator&amp;() const volatile { return 0; } }; int main() { ghost clyde; ghost* clydes_address = &amp;clyde; // darn; that's not clyde's address :'( } clydeのアドレスを取得するにはどうすればよいですか? すべてのタイプのオブジェクトに対して同等に機能するソリューションを探しています。C ++ 03ソリュ​​ーションがいいですが、C ++ 11ソリューションにも興味があります。可能であれば、実装固有の動作は避けてください。 C ++ 11のstd::addressof関数テンプレートは知っていますが、ここでは使用しません。標準ライブラリの実装者がこの関数テンプレートを実装する方法を知りたいのですが。

14
Scalaの演算子が「良い」のに、C ++の「悪い」のオーバーロードが発生するのはなぜですか。
C ++での演算子のオーバーロードは、多くの人にとってA Bad Thing(tm)であると考えられており、新しい言語ではミスを繰り返さないでください。確かに、これはJavaの設計時に特に削除された機能の1つでした。 Scalaについて読み始めたところ、演算子のオーバーロードに非常によく似ていることがわかりました(ただし、技術的には演算子がないため、関数だけなので、演算子のオーバーロードはありません)。ただし、C ++での演算子のオーバーロードとは質的に異なるようには思われません。C++では、演算子は特別な関数として定義されています。 それで私の質問は、Scalaで "+"を定義するアイデアがC ++でのアイデアよりも優れている理由は何ですか?

9
&&と||をオーバーロードする理由は実際にありますか?短絡しませんか?
短絡演算子の振る舞い&amp;&amp;とは、||プログラマのための素晴らしいツールです。 しかし、なぜオーバーロードするとこの動作が失われるのですか?演算子は関数の単なる構文糖であると理解していますが、演算子にboolはこのような振る舞いがあります。なぜこの単一の型に制限する必要があるのですか?この背後に技術的な理由はありますか?

5
メンバーアクセス演算子のオーバーロード->、。*
私は、メンバーアクセス演算子を除いて、ほとんどの演算子のオーバーロードを理解し-&gt;、.*、-&gt;*など 特に、これらの演算子関数に渡されるものと返されるものは何ですか? 演算子関数(例operator-&gt;(...))は、どのメンバーが参照されているかをどのようにして知るのですか?わかる?それも知る必要がありますか? 最後に、考慮に入れる必要があるconstの考慮事項はありますか?たとえば、のようなものをオーバーロードする場合operator[]、通常、constバージョンとnon-constバージョンの両方が必要になります。メンバーアクセスオペレーターにはconstバージョンとnon-constバージョンが必要ですか?

8
operator <<は、フレンド関数またはメンバー関数として実装する必要がありますか?
それは基本的に問題です、実装する「正しい」方法はありoperator&lt;&lt;ますか?これを読むと、次のようなことがわかります。 friend bool operator&lt;&lt;(obj const&amp; lhs, obj const&amp; rhs); のようなものよりも好ましい ostream&amp; operator&lt;&lt;(obj const&amp; rhs); しかし、なぜどちらを使用する必要があるのか​​、私にはよくわかりません。 私の個人的なケースは: friend ostream &amp; operator&lt;&lt;(ostream &amp;os, const Paragraph&amp; p) { return os &lt;&lt; p.to_str(); } しかし、おそらく私はできるでしょう: ostream &amp; operator&lt;&lt;(ostream &amp;os) { return os &lt;&lt; paragraph; } この決定の根拠となる根拠は何ですか? 注: Paragraph::to_str = (return paragraph) ここで、段落は文字列です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.