运算符重载:用同一个运算符完成不同的运算功能。 C++运算符重载的相关规定如下:
1.不能改变运算符的优先级。 2.不能改变运算符的结合性。 3.默认参数不能和重载的运算符一起使用,也就是说,在设计运算符重载成员函数时不能使用默认函数。 4.不能改变运算符的操作数的个数。 5.不能创建新的运算符,只有已有运算符可以被重载 6.运算符作用于C++内部提供的数据类型时,原来含义保持不变
C++中可被重载的运算符:
C++中不能被重载的操作符
运算符重载函数作为类的成员函数
运算符重载函数作为类的友元函数
其中,“函数类型”指出重载运算符的返回值类型,operator是定义运算符重载函数的关键词,“重载运算符”指出要重载的运算符名字,是C++中可重载的运算符,比如要重载加法运算符,这里直接写“+”即可,“形参表”指出重载运算符所需要的参数及其类型。 重载单目运算符
“++”和“–”重载运算符也有前缀和后缀两种运算符重载形式,以“++”重载运算符为例,其语法格式如下:
例:
输出结果为:
注:在上述程序中,定义了前缀++和后缀++重载运算符,在main()中,语句A++调用了后缀重载运算符,语句++B调用前缀重载运算符。
“->”运算符是成员访问运算符,这种单目运算符只能被重载为成员函数,一般成员访问运算符的时运格式如下:
成员访问运算符“->”函数重载的一般形式为:
例:
结果:
注:上述程序中,重载“->”运算符的成员函数,该函数返回当前对象的指针。从而导致“s->disp();”和“s.disp();”两个语句都是正确的,实际上,前者通过调用重载“->”运算符成员函数转换成后者的格式。
假设有一个类A,对于双目运算符op,如果重载运算符op使之能够实现表达式“obj1 op obj2”,其中obj1和obj2均为A类的对象。 若把op重载为A类的成员函数,该函数只有一个形参,形参的类型是obj2所属的类型。经过重载之后,表达式“obj1 op obj2”解释为:
左边的Obj1通过this指针传递,右边的对象obj2由参数传递。
假设有一个类A,对于双目运算符op,如果重载运算符op使之能够实现表达式“obj1 op obj2”,其中obj1和obj2均为A类的对象。 若把op重载为A类的友元函数,该函数有两个形参,经过重载之后,表达式“obj1 op obj2”解释为:
左右两个对象obj1,obj2都由参数传递。 下面是重载运算符为成员函数和重载为友元函数的对比: 例: 重载运算符为成员函数:
重载运算符为友元函数:
注意:重载运算符为成员函数和友元函数时关键的区别在于成员函数具有this指针,而友元函数没有this指针。
比较运算符函数重载必须返回true(非0)和false(0)。
重载“+=”和“-=”运算符
程序中重载运算符“+=”和“-=”与标准数据类型“+=”和“-=”不完全相同。调用重载的运算符时,例如V1+=V2,并不改变V1的值,而后者会改变运算符左边的值。
可以看出,重载+=与-=运算符中,v1+v2的运算不改变v1的值。
重载=运算符
赋值运算符=的原有含义是将赋值号右边表达式的结果复制给赋值号左边的变量,通过运算符=的重载将赋值号右边的数据成员函数依次复制给左边对象的数据成员中。
下标运算符“[ ]”通常用于获取数组的某个元素,重载下标运算符可以实现数组下标的越界检测等。下标运算符重载只能作为类的成员函数,不能作为类的友元函数。
new和delete只能被重载为类的成员函数,不能重载为友元。而且,无论是否使用关键字static进行修饰,重载了的new和delete均为类的静态成员函数。 运算符new重载的一般格式如下:
在带有“参数表”时,应注意使用重载new的方式。例如,若有一个类X有如下重载new的成员函数:
则使用重载new的方式如下:
运算符delete重载的格式一般如下:
重载类型转换运算符格式:
类型转换运算符没有返回类型,因为类型名就代表了它的返回类型,而且没有任何参数。 转换运算符重载的缺点是无法定义其类对象运算符操作的真正含义,因为只能进行相应的对象成员数据和一般数据变量的转换操作。
函数调用运算符“()”只能说明成类的非静态成员函数,该函数具有以下的一般格式:
与普通函数一样,重载了的函数调用运算符可以事先带有零个或多个参数,但不得带缺省的参数。
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/14999.html