换句话说,字符串比较中C和C ++有什么区别?
我来自'C'营地。我看到程序使用==来比较字符串,我试图找到它的重载程序,但没有找到一个。这是否意味着C ++自然地使用==和!=来处理字符串(char [])?
如果我有自己定义的String类,那么我可以使用==和!=而不定义它们吗?或者它只适用于char []?
编辑:
看起来我将C的char []与C ++ std :: string类混合在一起。好的,旧的问题仍然适用。一些问题如下:
我的程序定义了char []变量,但与“==”运算符进行了比较。看起来很有效。它们是C风格的字符串,但使用“==”。编译器是否为我自动将它们转换为std :: string以使程序工作?
EDIT2:
这是一份工作样本。
if(name == "") return;
其中“name”是MyString类项。它有一个带参数char *的construtor。
MyString有一个公共函数data(),它返回char * C风格的字符串指针
那么,我是在比较MyString对象吗?或C风格的字符串?
没有超载“!=”我自己,我可以做下面的事吗?
if( name.data() != somes_[i].data() )
....
答案 0 :(得分:5)
这是否意味着C ++自然地使用==和!=?
处理字符串(char [])
没有; "aaa" == "aaa"
会将字符串文字正常转换为char*
,并比较指针值。但是,C和C ++的大多数实现将至少在目标文件中对字符串文字数据进行重复数据删除,以使这些指针相同。标准不保证这一点,但已广泛实施。
换句话说,C ++在这方面与C没有区别,比较char*
这种方式并不比在C中这样做好。
编译器是否为我自动将它们转换为std :: string以便程序工作?
std::string
重载了与char*
一起使用的比较运算符。如果您将char*
与std::string
进行比较,则会使用其中一个。
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 );
答案 1 :(得分:5)
“这是否意味着C ++自然地与char []
和==
处理字符串(!=
)?”
否即可。将C风格的字符串(即char[]
或char*
)与==
或!=
(在C和C ++中)进行比较是错误的,因为您将结束比较指针而不是字符串。
在C ++中,由于std::string
的{{3}}和{{3},可以将std::string
对象与C风格的字符串或其他std::string
对象进行比较}:
std::string str1("abc"), str2("def");
if (str1 != str2 && str1 == "abc")
std::cout << "Yep, I got it.";
答案 2 :(得分:0)
不要使用!=或!=来比较C风格的字符串(char *或char [])。
如果您确定字符串为空终止,请使用std :: strcmp()。如果你不是绝对100%正,他们是空终止,使用std :: strncmp()来比较它们。
如果你的任何一个字符串是std :: string,你可以使用operator ==或operator!=。
[响应barnes53的评论编辑]