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

时间:2013-03-19 07:51:07

标签: c++ string operator-overloading comparison-operators

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

多么棒的社区。非常感谢你们,你们很快就回答了我的问题而没有让我感到愚蠢!

2 个答案:

答案 0 :(得分:5)

好吧,我需要在这里提出几点意见。

  • 如果用字符串表示字符数组/指针,那么就不能重载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代替循环,但我认为这样更有效。

答案 1 :(得分:2)

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

除了真正的平等之外,任何operator==重载都是不可取的。即如果a == bab的行为相同

您更喜欢做的是编写一个具有有意义名称的单独函数,例如

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