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. JavaScript等価演算子
- 3. 関数パラメータ内の等価演算子(==)
- 4. Allegroの等価演算子オーバーロード
- 5. 文字列等価演算子== in c#
- 6. コンパイルの問題等価/不等式演算子
- 7. 演算子評価
- 8. プロキシクラスの等価演算子関数の実装方法
- 9. case(In)等価演算子=== '&!==' C言語のVerilogが好き
- 10. ネストされた配列のスウィフト等価演算子
- 11. バッシュ平等演算子(==、-eq)
- 12. 代入演算子と平等演算子
- 13. PHPの等価比較演算子と同一比較演算子の違いは何ですか?
- 14. クラス{演算子Foo(); }
- 15. Stringクラスのサブスクリプト演算子をオーバーライドする
- 16. デルファイの同等の演算子
- 17. C#のオーバーロード演算子==クラス
- 18. C++クラスの演算子
- 19. "OrElse"と "AndAlso"(Rubyの同等演算子)
- 20. NHibernateのオーバーライド==(等号)演算子?
- 21. SQL OR演算子の評価方法
- 22. LUCENE.NET用SQL Serverの "IN"のような等価演算子は何ですか
- 23. 演算子if演算子
- 24. DOM要素のJavaScript等価演算子はブラウザ間でですか?
- 25. 構造体の二重等価演算子をオーバーロードしますか?
- 26. テスト等価(Golang)
- 27. xml.etree.ElementTreeの等価テスト
- 28. SQLiteにnull安全な等価演算子<=>と同等のものは何ですか?
- 29. C++クラスの演算子+のオーバーロード。
- 30. C++:演算子オーバーロード、演算子+
どのような例がありますか? std :: stringは例えばです。 –
Hmmm ... std :: stringについて確かですか?私はstd :: string(MSVCの実装)の実装をチェックしましたが、 '=='の実装は含まれていません。 – Rafid
私はそれを実装していない主な理由は、それらの表現ではなく、非常に低いレベルの値(つまりポインタとコンテンツ)を比較することになっている '=='のデフォルトの動作を無効にすることだと思いました。 – Rafid