background image

C++ 

 

中重载 + 操作符的正确方法

  

 

用户定义的类型,如:字符串,日期,复数,联合体以及文件常常重载二元 + 操作符

 

以实现对象的连接,附加或合并机制。但是要正确实现 + 操作符会给设计,实现和性能带
来一定的挑战。本文将概要性地介绍如何选择正确的策略来为用户定义类型重载这个操作
符。

 

考虑如下的表达式: int x=4+2;

 

  内建的 + 

 

操作符有两个类型相同的操作数,相加并返回右值 6

 

,然后被赋值给 x。我

 

们可以断定内建的 + 是一个二元的,对称的,可交换的操作符。它产生的结果的类型与其
操作数类型相同。按照这个规测,当你为某个用户定义类型重载操作符时,也应该遵循相
应内建操作符的特征。

 

  为用户定义类型重载 + 

 

操作符是很常见的编程任务。尽管 C++ 提供了几种实现方法,

但是它们容易使人产生设计上的误解,这种误解常常影响代码的正确性,性能以及与标
准库组件之间的兼容性。
  下面我们就来分析内建操作符的特征并尝试模仿其相应的重载机制。

  第一步:在成员函数和非成员函数之间选择

  你可以用类成员函数的方式实现二元操作符如:+、- 

 

以及 ==,例如:

class String
{
public:
bool operator==(const String & s); // 

 

比较 *this   

和 s

};  

  这个方法是有问题的。相对于其内建的操作符来说,重载的操作符在这里不具有对称
性;它的两个参数一个类型为:const String * const(这个参数是隐含的),另一个类型
为:const String &

 

。因此,一些 STL 算法和容器将无法正确处理这样的对象。

 

  另外一个可选方法是把重载操作符 + 定义为一个外部(extern)函数,该函数带两个
类型相同的参数:

String operator + (const String & s1, const String s2);

 

  这样一来,类 String 必须将该重载操作符声明为友元:

class String
{
public:
friend String operator+(const String& s1,const String&s2);
};