1

换句话说,在字符串比较中 C 和 C++ 有什么区别?

我来自'C'阵营。我看到程序使用 == 来比较字符串,我试图找到它的重载程序,但没有找到。这是否意味着 C++ 自然地使用 == 和 != 处理字符串 (char [])?
如果我有自己定义的 String 类,是否可以使用 == 和 != 而不定义它们?还是仅适用于 char []?

编辑:
看起来我将 C 的 char[] 与 C++ std::string 类混合在一起。好的,老问题仍然适用。一些后续问题如下:
我的程序定义了 char[] 变量,但与“==”运算符相比。这似乎工作。它们是 C 风格的字符串,但使用“==”。编译器是否为我自动将它们转换为 std::string 以便程序正常工作?

Edit2:
这是一个工作示例。

if(name == "") return;

其中“name”是 MyString 类项。它有一个带有参数 char* 的构造函数。
MyString 有一个公共函数 data(),它返回 char* C 风格的字符串指针。
那么,我是在比较 MyString 对象吗?还是 C 风格的字符串?
如果没有超载“!=”我自己,我可以做下面的事情吗?

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

3 回答 3

7

char []“这是否意味着 C++自然地用==and处理字符串 ( ) !=?”

没有。用or (在 C 和 C++ 中)比较 C 风格的字符串(即char[]or )是错误的,因为您最终会比较指针而不是字符串。char*==!=

在 C++ 中,可以将std::stringobject 与 C 风格的字符串或另一个std::string对象进行比较,因为std::string'soperator==operator!=

std::string str1("abc"), str2("def");
if (str1 != str2 && str1 == "abc")
    std::cout << "Yep, I got it.";
于 2013-10-07T19:24:14.037 回答
6

这是否意味着 C++ 自然地使用 == 和 != 处理字符串 (char [])?

不; "aaa" == "aaa"将字符串文字转换char*为正常,并比较指针值。然而,C 和 C++ 的大多数实现都会对字符串文字数据进行重复数据删除,至少在目标文件中是这样,因此这些指针将是相同的。标准不保证这一点,但已广泛实施。

换句话说,C++ 在这方面与 C 没有区别,并且以char*这种方式比较值并不比在 C 中这样做更好。

编译器是否为我自动将它们转换为 std::string 以便程序正常工作?

std::string具有与 . 一起使用的重载比较运算符char*。如果您将 achar*与a 进行比较,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 );
于 2013-10-07T19:23:32.687 回答
0

不要使用 != 或 != 来比较 C 风格的字符串(char * 或 char[])。

如果您确定字符串为空终止,请使用 std::strcmp()。如果您不是绝对 100% 肯定它们是空终止的,请使用 std::strncmp() 来比较它们。

如果您的任何一个字符串是 std::string,您可以使用 operator == 或 operator !=。

[根据 barnes53 的评论编辑]

于 2013-10-07T19:28:42.450 回答