2011-01-28 14 views
0

C++の多くの文字列クラスは、文字列と比較するために==演算子を実装していないことに気付きました。その背後にある理由は何ですか?私が見る限り、文字列のクラスを実装すると、文字セットへのポインタではなく、文字列を単独でエンティティにすることになっています。したがって、==演算子を実装して、2つのエンティティ(つまり文字列)の値を比較することが確実に期待されます。Stringクラスの等価テスト演算子

+2

どのような例がありますか? std :: stringは例えばです。 –

+0

Hmmm ... std :: stringについて確かですか?私はstd :: string(MSVCの実装)の実装をチェックしましたが、 '=='の実装は含まれていません。 – Rafid

+0

私はそれを実装していない主な理由は、それらの表現ではなく、非常に低いレベルの値(つまりポインタとコンテンツ)を比較することになっている '=='のデフォルトの動作を無効にすることだと思いました。 – Rafid

答えて

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 ::文字列)

+0

これは、比較を行うためにtraitsクラスに委任する理由です。大文字と小文字を区別しない比較は、その方法を比較する特性クラスを使用して行うことができます。 – CashCow

+0

@CashCow:そのリンクはありますか?とにかく、別の文字列を実装するときにデザインの選択肢を示していました。 – stefaanv

+0

それは良い点です。ありがとう。 – Rafid

2

のstd ::文字列がのbasic_stringされ、それが演算子を持っているん==、 char_traitsのcompareメソッドを使用します。

大文字と小文字を区別しない比較を行うために、独自の専門特性クラスを配置することもできます。

関連する問題