张 捷
(黄冈职业技术学院 黄冈 438002)
运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的表达式的行为。运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算符表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。
例如:用“+”运算符完成两个实数、两个复数、两个字符串的相关运算。两个实数a=10,b=2,则两个实数相加的结果是:a+b=10+2=12;两个复数:a=10+2i,b=2+10i,则两个复数相加的结果是:a+b=12+12i;两个字符串:a=“visual”,b=“ studio”,则两字符串连接的结果是:a+b=“visual studio”。由上例可以看出,同一个运算符“+”可以用于完成实数加法、复数加法及字符串连接等不同的运算,得到不同的结果。这就是“+”运算符的重载。因此,所谓的运算符重载就是用同一个运算符完成不同的运算操作。
对运算符进行重载需要遵守以下规则:
(1)重载运算符限制在C++语言中已有的并允许重载的运算符。C++中的运算符除五个运算符“.、* 、::、sizeof、?:”之外,其它都可重载。
(2)重载之后运算符的优先级和结合性均不改变。这就是说,对运算符重载不改变运算符的优先级和结合性,并且运算符重载时,单目运算符只能重载为单目运算符,双目运算符只能重载为双目运算符。
(3)不能改变运算符运算数的个数。在运算数中,至少有一个操作对象是自定义类型。
(4)重载运算含义必须清楚,不能产生二义性。运算符的重载实质是函数重载。运算符重载一般分两种形式,即重载为类的成员函数和重载为类的友元函数,这两种形式都可访问类中的私有成员。
在C++中,运算符的重载有两种方法:使用类的成员函数重载和使用fiend函数重载。下面通过实例来说明这两种重载方法的实现。
1、 使用成员函数重载运算符
运算符重载函数为类的成员函数的常见格式为:
返回类型 类名::operator重载运算符(参数表)
{函数体}
其中,函数类型指定重载运算符的返回值类型;operator是定义运算符重载函数的关键字;运算符是要重载的运算符名称;参数表中给出重载运算所需要的参数和类型。一般情况下,单目运算符采用成员函数形式重载时,操作数由对象的this指针给出,不需要参数;双目运算符采用成员函数形式重载时,一个操作数是对象本身的数据,由this指针指出。参数表的参数为第二操作数,只需一个参数。总之,当运算符重载为类的成员函数时,除后置“++、--”外,函数的参数个数比原来的操作数个数少一个。
实例:定义一个复数类,重载“=”运算符,使这个运算符能直接完成复数的赋值运算。
#include
Calss complex
{private:
Float real,image;
Public:
Complex(float r=0,float i=0)
{real=r;image=i;}//缺省构造函数
Void show(int i) //显示输出复数
{count<<”c”<
Void operator=(complex&c)
{real=c.real;image=c.image;
}
};
Void main(void)
{complexc1(25,20),c2;
C1.show(1);
C2=c1;
C2.show(2);
}
程序执行后输出:c1=25+50i c2=25+50i
该重载函数的函数名为“operator=”,返回类型为void,形参为复数类对象的引用complex&c。当程序执行主函数中的赋值语句c2=c1而遇到赋值运算符“=”时,自动调用赋值运算符“=”重载函数“operator=()”,并将“=”运算符右边的操作数c1作为实参,左边操作数c2作为调用重载函数的对象,即作了一次c2.operator=(c1)的函数调用。在函数的调用过程中,实参c1传给形参c,在函数体内完成了复数实部与虚部的赋值操作。
2、 使用friend函数重载运算符
对于运算符op,如果它的一个操作数为类A的对象,就可以将运算符重载为A类的友元函数,该函数有两个形参,其中一个形参的类型是A类。经过这样的重载后,表达式k op t就相当于函数调用operator op(k,t)。与使用成员函数定义的方法相比较,友元函数的一般定义格式只是在前面多了一个关键字friend,其他项目含义相同,除格式差别外,友元函数不是k所在类的成员函数。运算符重载函数为友元函数的一般定义格式为:Friend类型operator重载运算符(参数表){函数体}
由于C++语言支持函数重载,所以才能将运算符当成函数来使用。但是在编程过程中要适当运用运算符重载:既不要因过分担心自己不会用而不使用,它的本质仍然是程序员们熟悉的函数;也不要过度的使用,如果它不能使代码变得更加易读易写,那就别用,否则会增加程序出错的可能。同时在使用运算符的重载时还要注意如下问题:
■不能改变C++内部数据类型(如int,float等)的运算符
■不能重载“.”,因为“.”在类中对任何成员都有意义,已经成为标准用法。
■不能重载目前C++运算符集合中没有的符号,如#,@,$等。原因有两点,一是难以理解,而是难以确定优先级。
■对已经存在的运算符进行重载时,不能改变优先级规则,否则将引起混乱。
[1]兰添才.C++中函数重载与操作符重载的应用探讨[J].福建电脑,2003,(02).
[2]蓝雯飞,陆际光.C++语言的重载机制剖析[J].微计算机应用,2000,(05).
[3]李 智.C++宏,函数重载与模板机制[J].电脑,1995,(05).
[4]李 智.C++函数重载与继承机制的应用[J].中国金融电脑,1995,(08).
[5]沈慧娟.C++语言中运算符重载的应用研究[J].甘肃广播电视大学学报,2006,(03).