庞新法 PANG Xin-fa
(陕西省委党校科技教研部,西安 710061)
(Shaanxi Province Party School of the CPC,Xi'an 710061,China)
自然语言中的“一词多义”,反映到程序中就是重载。例如“行动”、“银行”,“行”到底发何音,是何意,要根据上下文理解。
在C语言中,运算符符“-”既表示两数相减,又表示取一个数的相反数;既可作用于整型数据,又可作用于实型、指针等其它类型的数据,这就是运算符重载。C++是C功能的扩充,比C更完善,更全面。
所谓运算符重载就是同一个运算符,根据不同的数据类型有着不同的含义和运算,具体含义要根据上下文理解。重载扩充了C++预定义的运算符的运算范围,运算符既可对已有数据类型进行运算,又可对用户自己定义的新类型数据进行运算,方便编程。
格式:函数类型operator运算符(形参表)
{函数体;}
功能:operator与运算符的组合就是函数名。
运算符重载实质就是函数重载,C++在编译过程中,把operator与运算符的组合解释为函数名,然后按照函数的定义、引用处理。
例1 class Co//复数类
可重载的运算符
可重载的运算符
①重载的运算符有限制。②不能改变原运算符的优先级、结合性、操作数的个数、语法结构。③对已有的C++运算符重载。④当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个。原因是成员函数通过this指针隐式地访问类对象的参数;当重载为类的友元函数时,参数个数与原操作数个数相同。⑤运算符重载实质上是函数重载,因此编译程序按照函数重载的处理办法对运算符重载进行处理。⑥旧类型旧含义,新类型新含义,新含义与旧含义功能相似。
4.1 重载为类的成员函数 如例1所示。程序中出现的表达式:x+y编译程序将给解释为:x.operator+(y),其中,x和y是Co类的对象。operator+()是运算+的重载函数。该运算符重载函数仅有一个参数y。可见,当重载为成员函数时,双目运算符仅有一个参数。对单目运算符,重载为成员函数时,不能再显式说明参数。重载为成员函数时,总时隐含了一个参数,该参数是this指针。this指针是指向调用该成员函数对象的指针。
4.2 重载为友元函数 运算符重载函数还可以为友元函数。当重载友元函数时,将没有隐含的参数this指针。这样,对双目运算符,友元函数有2个参数,对单目运算符,友元函数有一个参数。但是,有些运行符不能重载为友元函数,它们是:=,(),[]和->。
重载为友元函数的运算符重载函数的定义格式如下:
对于双目运算符,重载为成员函数时,仅一个参数,另一个被隐含;重载为友元函数时,有两个参数,没有隐含参数。因此,程序中出现的x+y编译程序解释为:operator+(x,y)调用函数Co operator+(const coplex&c1,const Co&c2)进行求值。
例3 class Co//复数类
多态性是面向对象程序设计的重要支柱之一,而运算符重载又是实现多态性的一个重要途径。运算符重载使得程序员把运算符的使用扩展到操作数是对象的情况,由运算符构成的表达式常常比函数调用更简洁易懂,熟练掌握运算符重载,以提高C++编程能力。
[1]钱能.C++程序设计教程[M].清华大学出版社,2006.
[2]郑莉.C++语言程序设计[M].清华大学出版社,2002.
[3]杨俊清.C++程序设计[M].西安电子科技大学出版社,2003.