9.5 运算符重载

    前文已经介绍过函数重载的相关内容,简单地说,函数重载就是赋给同一个函数名多个含义。具体地讲,C++中允许在相同的作用域内以相同的名字定义几个不同的实现函数,这些函数的参数的类型或个数有所不同,而对于返回值的类型没有要求,可以相同,也可以不同。那种参数个数和类型都相同,仅仅返回值不同的重载函数是非法的。因为编译程序在选择相同名字的重载函数时仅考虑函数表,也就是说要靠函数在参数表中参数个数或参数类型的差异进行选择。

    重载函数的意义在于用相同的名字访问一组相互关联的函数,由编译程序来进行选择,这有助于解决程序复杂性问题。如构造函数重载给类对象初始化带来了多种方式,为用户提供了更大的灵活性和自由度。

    在C++中,操作符和函数是等价的、统一的,因此,运算符也可以重载,虽然系统已经预定义了一些操作符的功能,但毕竟应用有所限制,不能灵活地解决各种问题,而运算符重载可以赋予已有的运算符多重含义。通过重新定义运算符,使它能够用于特定类的对象执行特定的功能,这使得C++具有很强的可扩展性。

    9.5.1 运算符重载规则

    运算符是一种通俗、直观的函数,如下所示。


    int x=2+3;上述语句中的“+”操作符,系统本身就提供了很多个重载版本。 int operator+(int,int); double operator+(double,double);

    注意

    operator是C++关键字,用以标识后面所跟的为操作符。

    对某个类来说,如果要计算该类两个对象的加和,有两种方式,一种是构造一个add函数,另一种是重载操作符“+”,推荐采用操作符重载,这会使得程序更加直观、易读易写,不易出错。

    除了表9.1列出的5个运算符外,几乎所有的C++运算符都可重载,具体包括以下几种。

    ❑算术运算符:+、-、*、/、%、++、—

    ❑位操作运算符:&、~、^、<<、>>

    ❑逻辑运算符:!、&&、||

    ❑比较运算符:<、>、>=、<=、==、!=

    ❑赋值运算符:=、+=、-=、*=、/=、%=、&=、^=、<<=、>>=

    ❑其他运算符:[]、()、->、(逗号运算符)、new、delete、new[]、delete[]、->、*

    注意

    诸如“#”等非C++运算符是不能被重载的。

    此外,还有一条重要原则是不能臆造C++中不存在的运算符,如@和$等。

    运算符的重载不改变其优先级和结合性,也不改变运算符的语法结构,即单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。

    9.5 运算符重载 - 图1

    用户自定义的重载运算符,要能访问对象的private成员,因此,对一个类来说,运算符重载的方式有成员函数和友元函数两种形式,下面结合实例分别对两种形式进行介绍。