C++ Primer 学习笔记_59_重载操作符与转换 --输入/输出、算术/关系操作符(二)

2014-11-24 12:34:35 · 作者: · 浏览: 1
hs.units_sold; tmp.revenue = lhs.revenue + rhs.revenue; return tmp; } Sales_item& Sales_item::operator+=(const Sales_item& rhs) { *this = *this + rhs; return *this; }

四、关系运算符

1、相等运算符

如果所有对应成员都相等,则认为两个对象相等。

inline
bool operator==(const Sales_item &lhs,const Sales_item &rhs)
{
    return lhs.revenue == rhs.revenue && lhs.units_sold == rhs.units_sold &&
           lhs.same_isbn(rhs);
}

inline
bool operator!=(const Sales_item &lhs,const Sales_item &rhs)
{
    return !(lhs == rhs);
}

1)如果类定义了==操作符,该操作符的含义是两个对象包含同样的数据。

2)如果类具有一个操作,能确定该类型的两个对象是否相等,通常将该函数定义为 operator==而不是创造命名函数。用户将习惯于用==来比较对象,而且这样做比记住新名字更容易

3)如果类定义了operator==,它也应该定义operator!=。用户会期待如果可以用某个操作符,则另一个也存在。

4)相等和不操作符一般应该相互联系起来定义,让一个操作符完成比较对象的实际工作,而另一个操作符只是调用前者

定义了operator==的类更容易与标准库一起使用。有些算法,如find,默认使用==操作符,如果类定义了==,则这些算法可以无需任何特殊处理而用于该类类型!


2、关系操作符

定义了相等操作符的类一般也具有关系操作符。尤其是,因为关联容器和某些算法使用小于操作符(<),所以定义了operator<可能相当有用。

如果因为<的逻辑定义与==的逻辑定义不一致,所以这样的话,不定义<会更好。

【注释】

关联容器以及某些算法,默认使用<操作符(此处本人认为译者翻译有误,原文:...usethe < operator bydefult...,译者翻译为:使用默认<操作符,但本人认为默认使用更为恰当!)。一般而言,关系操作符,诸如相等操作符,应定义为非成员函数(“对称”操作符)。