C++运算符重载剖析

2014-04-16 03:29庞新法PANGXinfa
价值工程 2014年17期

庞新法 PANG Xin-fa

(陕西省委党校科技教研部,西安 710061)

(Shaanxi Province Party School of the CPC,Xi'an 710061,China)

1 绪论

自然语言中的“一词多义”,反映到程序中就是重载。例如“行动”、“银行”,“行”到底发何音,是何意,要根据上下文理解。

在C语言中,运算符符“-”既表示两数相减,又表示取一个数的相反数;既可作用于整型数据,又可作用于实型、指针等其它类型的数据,这就是运算符重载。C++是C功能的扩充,比C更完善,更全面。

所谓运算符重载就是同一个运算符,根据不同的数据类型有着不同的含义和运算,具体含义要根据上下文理解。重载扩充了C++预定义的运算符的运算范围,运算符既可对已有数据类型进行运算,又可对用户自己定义的新类型数据进行运算,方便编程。

2 运算符重载语法形式

格式:函数类型operator运算符(形参表)

{函数体;}

功能:operator与运算符的组合就是函数名。

运算符重载实质就是函数重载,C++在编译过程中,把operator与运算符的组合解释为函数名,然后按照函数的定义、引用处理。

例1 class Co//复数类

可重载的运算符

可重载的运算符

3 运算符重载的规

①重载的运算符有限制。②不能改变原运算符的优先级、结合性、操作数的个数、语法结构。③对已有的C++运算符重载。④当运算符重载为类的成员函数时,函数的参数个数比原来的操作个数要少一个。原因是成员函数通过this指针隐式地访问类对象的参数;当重载为类的友元函数时,参数个数与原操作数个数相同。⑤运算符重载实质上是函数重载,因此编译程序按照函数重载的处理办法对运算符重载进行处理。⑥旧类型旧含义,新类型新含义,新含义与旧含义功能相似。

4 运算符重载形式

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)进行求值。

5 重载输出流运算符<<

例3 class Co//复数类

6 结语

多态性是面向对象程序设计的重要支柱之一,而运算符重载又是实现多态性的一个重要途径。运算符重载使得程序员把运算符的使用扩展到操作数是对象的情况,由运算符构成的表达式常常比函数调用更简洁易懂,熟练掌握运算符重载,以提高C++编程能力。

[1]钱能.C++程序设计教程[M].清华大学出版社,2006.

[2]郑莉.C++语言程序设计[M].清华大学出版社,2002.

[3]杨俊清.C++程序设计[M].西安电子科技大学出版社,2003.