1

つまり、文字列比較における C と C++ の違いは何ですか?

私は「C」キャンプから来ました。== を使用して文字列を比較するプログラムを見たので、オーバーロードしているプログラムを見つけようとしましたが、見つかりませんでした。C++ は文字列 (char []) を == と != で自然に扱うということですか?
独自に定義した String クラスがある場合、定義せずに == と != を使用できるのと同じでしょうか? それともchar []にのみ適用されますか?

編集:
C の char[] を C++ std::string クラスと混合したようです。OK、古い質問がまだ適用されます。私のプログラムはchar
[] 変数を定義しましたが、"==" 演算子と比較しました。それは仕事のようでした。これらは C スタイルの文字列ですが、「==」で機能します。プログラムが機能するように、コンパイラはそれらを std::string に自動変換しましたか?

Edit2:
これは実際のサンプルです。

if(name == "") return;

ここで、「name」は MyString クラス アイテムです。パラメータ char* を持つコンストラクタがあります。
MyString には public 関数 data() があり、char* C スタイルの文字列ポインターを返します。
では、MyString オブジェクトを比較していますか? またはCスタイルの文字列?
オーバーロードなしで "!=" 自分で、以下のようなことはできますか?

if( name.data() != somes_[i].data() )
....
4

3 に答える 3

6

C++ は文字列 (char []) を == と != で自然に扱うということですか?

いいえ; "aaa" == "aaa"文字列リテラルをchar*通常どおりに変換し、ポインター値を比較します。ただし、C および C++ のほとんどの実装では、少なくともオブジェクト ファイル内で文字列リテラル データの重複が排除されるため、これらのポインターは同じになります。これは標準では保証されていませんが、広く実装されています。

言い換えれば、C++ はこの点で C と変わらず、char*この方法で値を比較することは、C で行うよりも優れているわけではありません。

プログラムが機能するように、コンパイラはそれらを std::string に自動変換しましたか?

std::stringには、 で機能するオーバーロードされた比較演算子がありchar*ます。char*aと anを比較すると、std::stringそのうちの 1 つが使用されます。

char const *s = "aaa";
std::string t = "aaa";
s == t; // uses overloaded operator== to compare string values.

http://en.cppreference.com/w/cpp/string/basic_string/operator_cmp

template< class CharT, class traits, class Alloc >
bool operator==( const CharT* lhs, const basic_string<CharT,Traits,Alloc>& rhs );
于 2013-10-07T19:23:32.687 に答える
0

!= または != を使用して C スタイルの文字列 (char * または char[]) を比較しないでください。

文字列が null で終了していることが確実な場合は、std::strcmp() を使用してください。それらが null で終了していることを 100% 確実に確信できない場合は、 std::strncmp() を使用してそれらを比較してください。

いずれかの文字列が std::string の場合、演算子 == または演算子 != を使用できます。

[barnes53 からのコメントに応じて編集]

于 2013-10-07T19:28:42.450 に答える