C++语言中预定义的运算符的操作对象只能是基本数据类型,但是,在实际应用中,对于很多用户自定义数据类型(如类)也需要类似的功能,这就需要对已有的运算符赋予多种含义,使同一个运算符具有作用于不同类性的数据导致不同类型的行为,这就是运算符重载。因此,运算符重载的目的是设置C++语言中的某一运算符,让它们之间并不冲突,C++语言会根据运算符的位置辨别应使用哪一种功能进行运算。可见,运算符重载的优点是允许改变使用于系统内部的运算符的操作方式,以适应用户新定义类型的类似运算。
运算符重载的实质是函数重载。事实上,C++语言中的每一个运算符对应着一个运算符函数,在实现过程中,把指定的运算表达式中的运算符转化为对运算符函数的调用,而表达式中的运算对象转化为运算符函数的实参,这个过程是在编译阶段完成的。例如:
int a=1,b=2;
a+b;
表达式“a+b”在编译前,将被解释为函数调用形式:operator+(a,b)。
其中,operator是一个关键字,它与后面的“+”共同组成了该运算符函数的函数名。
运算符重载是一种特殊的函数重载。在类中可以采用下述两种方法对运算符函数进行重载。
1.重载为类的成员函数
将运算符函数重载为类的成员函数是指在类中定义一个同名的运算符函数,其语句格式为:
TYPE X::operator@(形参表)
{
//函数体
//重新定义运算符@在指定类X中的功能
}
其中,operator是关键字,@是需要被重载的运算符,X是需要重载该运算符的类名,TYPE是该运算符函数的返回值类型。关键字operator与后面的运算符@共同组成了该运算符函数的函数名。
2.重载为类的友元函数
可以定义一个与某一运算符函数同名的全局函数,然后再将该全局函数声明为类的友元函数,从而实现运算符的重载。其语法格式为:
friend TYPE operator@(形参表);
下面介绍运算符重载的几个问题:
l 以上两种重载形式均可访问类的私有成员;
l 几乎所有的运算符都可以被重载,但下列运算符不允许重载:
“。”、“。*”、“::”、“?:”
l 运算符重载后,既不会改变原运算符的优先级和结合特性也不会改变使用运算符的语法和参数个数;
l “=”、“()”、“[]”和“->”等运算符不能重载为友元函数;
l 当运算符重载为类的成员函数时,函数的参数个数比原来的运算对象少一个(右++和右——除外);当重载为类的友元函数时,参数个数与原运算符的运算个数相同;单目运算符最好重载为类的成员函数,而双目运算符则最好重载为类的友元函数。
系列文章:
C++学习摘要之一:类和对象
C++学习摘要之二:构造函数和析构函数
C++学习摘要之三:继承和派生
C++学习摘要之四:虚函数和多态
C++学习摘要之五:静态成员
C++学习摘要之六:友元函数与友元类
C++学习摘要之八:模板
C++学习摘要之九:C++流和文件流
版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明!