算术和关系运算符

通常情况下把算术和关系运算符定义成非成员函数以允许对左侧或右侧运算对象进行转换。

因为这些运算符一般不需要改变运算对象的状态,所以形参都是常量引用。

算术运算符通常会计算它的两个运算对象并得到一个新值,这个值有别于任意一个运算对象,常常位于一个局部变量之内,操作完成后返回该局部变量的副本作为其结果。

如果类定义了算术类型,则一般也会定义一个对应的复合赋值运算符,此时最有效的方式是使用复合赋值来定义算术运算符:

Sales_data
operator +(const Sales_data &lhs,const Sales_data &rhs)
{
	Sales_data sum = lhs;
	sum += rhs;
	return sum;
}

注意:

如果类同时定义了算术运算符和相关的复合赋值运算符,则通常情况下应该使用复合赋值来实现算术运算符。

相等运算符

bool operator ==(const Sales_data &lhs,const Sales_data &rhs)
{
	return lhs.isbn() == rhs.isbn() && lhs.units_sold == rhs.units_sold &&
	lhs.revenue == rhs.revenue;
}

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

  • 如果某个类在逻辑上有相等性的含义,则该类应该定义 operator==,这样做可以使得用户更容易使用标准库算法来处理这个类。
  • 如果类定义了 operator==,那么通常也应该定义 operator!=
  • 相等运算符和不等运算符只需要定义一个,把另一个运算对象委托给真正工作的那个函数。

关系运算符

如果存在唯一一种逻辑可靠的 < 定义,则应该考虑为这个类定义 < 运算符。

原文地址:https://www.cnblogs.com/xiaojianliu/p/12496410.html