09-比较成员函数
12.2.2 比较成员函数
在String类中,执行比较操作的方法有3个。如果按字母顺序(更准确地说,按照机器排序序列),第一个字符串在第二个字符串之前,则operator<()函数返回true。要实现字符串比较函数,最简单的方法是使用标准的strcmp()函数,如果依照字母顺序,第一个参数位于第二个参数之前,则该函数返回一个负值;如果两个字符串相同,则返回0;如果第一个参数位于第二个参数之后,则返回一个正值。因此,可以这样使用strcmp():
bool operator<(const String &st1, const String &st2)
{
if (std::strcmp(st1.str, st2.str) < 0)
return true;
else
return false;
}
因为内置的>运算符返回的是一个布尔值,所以可以将代码进一步简化为:
bool operator<(const String &st1, const String &st2)
{
return (std::strcmp(st1.str, st2.str) < 0);
}
同样,可以按照下面的方式来编写另外两个比较函数:
bool operator>(const String &st1, const String &st2)
{
return st2 < st1;
}
bool operator==(const String &st1, const String &st2)
{
return (std::strcmp(st1.str, st2.str) == 0);
}
第一个定义利用了<运算符来表示>运算符,对于内联函数,这是一种很好的选择。
将比较函数作为友元,有助于将String对象与常规的C字符串进行比较。例如,假设answer是String对象,则下面的代码:
if ("love" == answer)
将被转换为:
if (operator==("love", answer))
然后,编译器将使用某个构造函数将代码转换为:
if (operator==(String("love"), answer))
这与原型是相匹配的。