如何在c ++中为字符串类重载==运算符?

How do I overload the == operator for the string class in c++?

本问题已经有最佳答案,请猛点这里访问。

我是一个新的c++程序员,我最近才了解运算符重载。在处理一个独立的项目时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以允许用户浏览一个简单的菜单。唯一的问题是我不知道如何比较两个字符串,而忽略了这个情况。如果有比重载==运算符更简单的方法,请让我知道,但也让我知道如何重载==运算符的字符串,因为我非常感兴趣。

多好的社区啊。多谢各位,你很快就回答了我的问题,没有让我觉得自己很傻!


好吧,我需要在这里说几点。

  • 如果按字符串表示字符数组/指针,则不能重载operator==,因为只允许用户定义类型使用运算符重载

  • 如果字符串的意思是std::string,那么就不能重载operator==either,因为它已经被重载了:)

  • 为了进行不区分大小写的比较,最好的方法是有一个命名函数,如case_insensitive_equal。Boost有一个-boost::iequals(str1, str2)

  • 您可以尝试编写自己的char_traits来创建不区分大小写的字符串类型。

关于如何以不区分大小写的方式编写比较字符串的函数,我将这样做:

1
2
3
4
5
6
7
8
9
bool case_insensitive_equal(const std::string& s1, const std::string& s2)
{
    if(s1.length() != s2. length())
       return false;
    for(int i = 0; i < s1.length(); ++i)
        if(std::toupper(s1[i]) != std::toupper(s2[i])) //tolower would do as well
            return false;
    return true;
}

您可以使用std::transformstd::equal,而不是循环,但我认为这样更有效。


对于std::string,您不会重载operator==,因为您必须将运算符放入std命名空间。这是(a)不允许的,并且(b)已经由标准库实现完成。

也不建议让任何一个operator==过载,以表示真正的平等以外的任何东西。也就是说,如果a == b,那么ab的行为应该相同。

您应该更喜欢使用一个有意义的名称编写一个单独的函数,例如

1
bool areEqualIgnoringCase(const std::string&, const std::string&);