第12章 运算符重载
运算符重载(operator overloading)只是一种“语法上的方便”(syntactic sugar),也就是说它只是另一种函数调用的方式。
其中的不同之处在于函数的参数不是出现在圆括号内,而是紧贴在一些字符旁边,这些字符我们一般认为是不可变的运算符。
运算符的使用和普通的函数调用有两点不同。首先语法上是不同的,“调用”运算符时要把运算符放置在参数之间,有时在参数之后。第二个不同是由编译器决定调用哪一个“函数”。例如,如果对参数为浮点类型使用运算符“+”,编译器会“调用”执行浮点类型加法的函数(这种调用通常是插入内联代码,或者一段浮点处理器指令)。如果对一个浮点数和一个整数使用运算符“+”,编译器将“调用”一个特殊的函数,把int类型转化为float类型,然后再“调用”浮点加法代码。
但在C++中,可以定义一个处理类的新运算符。这种定义很像一个普通函数的定义,只是函数的名字由关键字operator及其后紧跟的运算符组成。差别仅此而已。它像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。
12.1 两个极端
有些人很容易滥用运算符重载。它确实是一个有趣的工具。但应注意,它仅仅只是一种语法上的方便,是另外一种调用函数的方式而已。从这个角度看,只有在能使涉及类的代码更易写,尤其是更易读时(请记住,读代码的机会比写代码多多了)才有理由重载运算符。如果不是这样,就不庸人自扰了。
对于运算符重载,另外一个常见的反应是恐慌:突然之间,C运算符的含义变得不同寻常了。“一切都变了,所有C代码的功能都要改变!”并非如此。在仅包含内置数据类型的表达式中的所有运算符是不可能被改变的。我们不能重载如下的运算符改变其行为。
或者重载运算符使得下面的表达式有意义。
只有那些包含用户自定义类型的表达式才能有重载的运算符。