C++の多くの文字列クラスは、文字列と比較するために==
演算子を実装していないことに気付きました。その背後にある理由は何ですか?私が見る限り、文字列のクラスを実装すると、文字セットへのポインタではなく、文字列を単独でエンティティにすることになっています。したがって、==
演算子を実装して、2つのエンティティ(つまり文字列)の値を比較することが確実に期待されます。Stringクラスの等価テスト演算子
0
A
答えて
2
多くの場合、あるクラスがoperator==
を実装していない場合は、クラスの外にフリーの機能があるためです。自由な関数operator==
のアドバタイズメントは、両側で暗黙的な変換をサポートしていることです。これは、文字列の場合に特に重要です。なぜなら、多くの場合、リテラルをconst char[]
と使用し、その暗黙の変換を必要とするからです。例えば。
MyString S("Hello");
if ("hello" == S) { // Can't use MyString::operator== here
std::cout << S;
}
+0
私はこれが最良の答えだと信じています。ありがとう! – Rafid
1
文字列を比較する方法が他にもあると思われる理由は、大文字小文字の区別/非小文字の区別、アクセントの無視などです。異なる比較関数を用意してユーザーが指定します。
それはまだ選択肢とジェフ・フォスターが既にコメントしている:それはCでの唯一の本当の文字列に実装されている++(のstd ::文字列)
2
のstd ::文字列がのbasic_stringされ、それが演算子を持っているん==、 char_traitsのcompareメソッドを使用します。
大文字と小文字を区別しない比較を行うために、独自の専門特性クラスを配置することもできます。
関連する問題
- 1. 等価演算子のオーバーライド
- 2. Prologの等価演算子
- 3. JavaScript等価演算子
- 4. スウィフトオプションと等価演算子
- 5. 過負荷等価演算子ビット演算子
- 6. matlabのRの等価演算子/
- 7. cの等価演算子の使用
- 8. F#++演算子の等価物
- 9. Allegroの等価演算子オーバーロード
- 10. 関数パラメータ内の等価演算子(==)
- 11. Mongoidクエリの等価演算子
- 12. スウィフトコンパイラが等価演算子で等価演算子を使用するかどうかで等価演算子を使用する理由
- 13. 文字列等価演算子== in c#
- 14. 連鎖等価演算子オーバーロード
- 15. コンパイルの問題等価/不等式演算子
- 16. 演算子評価
- 17. 私のクラスの等価演算子(==)が機能していません
- 18. プロキシクラスの等価演算子関数の実装方法
- 19. perlの数字とアルファベットの等価演算子
- 20. case(In)等価演算子=== '&!==' C言語のVerilogが好き
- 21. テンプレートクラスのテンプレート等価演算子がコンパイルされない
- 22. ネストされた配列のスウィフト等価演算子
- 23. 等価演算子を使用したbefore_saveの動作
- 24. Powershell - OR演算子Select-string
- 25. バッシュ平等演算子(==、-eq)
- 26. 代入演算子と平等演算子
- 27. ":"演算子は代入演算子 "="と同等ですか?
- 28. PHPの等価比較演算子と同一比較演算子の違いは何ですか?
- 29. クラス{演算子Foo(); }
- 30. クラス演算子*オーバーロード
どのような例がありますか? std :: stringは例えばです。 –
Hmmm ... std :: stringについて確かですか?私はstd :: string(MSVCの実装)の実装をチェックしましたが、 '=='の実装は含まれていません。 – Rafid
私はそれを実装していない主な理由は、それらの表現ではなく、非常に低いレベルの値(つまりポインタとコンテンツ)を比較することになっている '=='のデフォルトの動作を無効にすることだと思いました。 – Rafid