5

C ++で「==」演算子をオーバーロードする場合、同等性が明示的に意味するものに関する標準的な定義、または「==」がどのように動作するかに関する一連のガイドラインはありますか?

私は現在、自分自身全体をメモリに保存しないクラスを持っています。基本的に、優先キューを使用して、内部のオブジェクトが使用されている頻度を決定し、オブジェクトがキューの最後からポップされると、メモリから削除されてディスクに書き込まれます。

したがって、問題は平等で発生します。これらのオブジェクトの2つが等しいとはどういう意味ですか。すべての点で同じオブジェクトAとBから始めることができるため、それらは同じデータをメモリにロードし、ディスク上に同じデータを持っています。しかし、AとBで一連の関数を呼び出した後、それらは異なる可能性があります。AとBはまだディスク上に同じデータを持っていますが、それらはメモリにロードされた異なるデータを持っています。それで、問題はA == B真か偽かを解決する必要があるかどうかです。

これがどのように機能するかを定義する一連のルールまたはガイドラインはありますか?それとも、これは、プログラムにとって何が最も理にかなっているのかを判断し、「==」が何をするのかを文書化するだけの状況ですか?

4

3 に答える 3

16

過負荷は、同値関係operator==の公理を尊重する必要があります。

  • x == x、すべてのオブジェクトx
  • の場合x == yy == x
  • との場合x == yy == z次にx == z

を使用する多くのアルゴリズム==は、概念として§17.6.3.1で形式化された同値関係を実装することに依存していEqualityComparableます。

于 2012-12-20T22:37:13.717 に答える
11

オーバーロードがどのように動作するかについての標準の定義はありませんoperator ==

しかし、十分なガイドラインはこれです-あなたが持っている限りそれについて考えなければならないなら、あなたはおそらく過負荷になるべきではありませんoperator ==。それが直感的でない場合、それは良いよりも害を及ぼします。

したがって、問題は、A==Bをtrueまたはfalseに解決する必要があるかどうかです。

IMO、コンパイラエラーが発生するはずです。:)

于 2012-12-20T22:36:10.003 に答える
2

すべての演算子のオーバーロードは、「期待どおり」に実行する必要があります。オブジェクトが実質的に同じでない場合にtrueを返す演算子==を使用しても意味がありません。もちろん、「同じ」をどのように定義するかは、私たちが議論できる可能性のあることです。文字列のように動作する「nocasestring」を実装することもできますが、文字列「HELLO」と「hello」が1つある場合、大文字と小文字は関係ないため、これらは等しいと見なされます。または、独自の「Float」クラスを実装した場合、ここで==は、通常の浮動小数点の脆弱な比較を回避するためにいくつかの計算を行います。そうです、==が正確に「すべての要素がa。== b。」であるとは限らない場合がありますが、それは実際には例外であるはずです。

同様に、演算子が完全に意味をなさない場合は、「驚くべき」ことをさせないでください(たとえば-、文字列の場合-それは何をしますか?またはある文字列に別の文字列を掛けます-整数を掛けることには意味があります)。

プログラミングの驚きは悪い考えです。期待どおりに機能しない場合は、コードの読み取り/変更によって悪い経験をすることになります。

于 2012-12-20T22:49:20.300 に答える