必备技能9.9:运算符重载
在本章的剩余部分,我们将讨论C++中最令人激动也是最强大的特性之一:运算符重载。在C++中,和我们创建的类相关的运算符可以被重载。运算符重载带来的好处就是:我们可以无缝地把心的数据类型集成到我们的程序环境中。
当进行运算符重载的时候,我们就是在针对一个特此的类来定义该运算符的含义。例如,链表类就可以使用+运算符来为链表中增加元素。栈类可以使用+运算符来把一个对象压入栈顶。
还有别的类可能以完全不同的另外的方式来使用+运算符。当一个运算符被重载以后,它并没有失去原有的含义。而是我们针对相关的类定义了一个新的运算符。因此重载+运算符来处理链表并不意味着+运算符对于整型数的含义也发生了变化。
运算符的重载和函数的重载是密切相关的。重载运算符的时候,我们必须针对和他相关的类来定义该运算符的含义。我们是通过创建一个运算符函数来进行运算符重载的。通用的形式如下:
类型 类名::operator#(参数列表)
{
//操作实现
}
这里,我们要用需要被重载的运算符来替换其中的#;其中的类型就是指定运算返回的类型。尽管这里的返回值可以是任意我们选择的类型,但是一般情况下,返回值的类型就是和我们重载运算符相关的类的类型。这样方便在复合表达式中使用该运算符。其中的参数列表由几个因素来决定。这点我们会在下面进行讨论。
运算符函数可以是类的成员函数,也可以不是类的成员函数。非类成员函数的运算符函数通常都是类的友元函数。但是两种运算符函数重载的方式还是有区别的。下面将逐一进行描述。
注意:由于C++中定义了很多的运算符,所以运算符重载涉及的范围是很广泛的。在本书中,我们不可能全部都覆盖到。更多关于运算符重载的信息,可以参见另外的C++书籍:Osborne/McGraw-Hill.出版的《C++ 全书》(英文名为:C++:The complete reference)