如何重载c++中string类的==操作符?

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

本文关键字:类的 string 操作符 c++ 何重载 重载      更新时间:2023-10-16

我是一个新的c++程序员,我最近才学习操作符重载。当我在一个独立的项目中工作时,我遇到了一个问题,我想将用户输入字符串与其他字符串进行比较,以便允许用户在一个简单的菜单中导航。唯一的问题是我不知道如何在忽略大小写的情况下比较两个字符串。如果有比重载==操作符更简单的方法,请告诉我,也请告诉我如何重载字符串的==操作符,因为我很感兴趣。

真是一个伟大的社区。非常感谢你们,你们很快就回答了我的问题,没有让我觉得自己很笨!

这里我需要说明几点。

  • 如果你的字符串指的是char数组/指针,那么你不能重载operator ==,因为operator重载只允许用户定义的类型

  • 如果您的字符串是指std::string,那么您也不能重载operator ==,因为它已经重载了:)

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

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

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

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的行为应该相同

你应该写一个有意义的名字的单独的函数,例如

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