1、1C程序设计运算符重载资料程序设计运算符重载资料24.1 运算符重载的概念运算符重载的概念3运算符重载的概念运算符重载的概念语言允许重新定义已有的运算符,使其完成一些只在该特定类中使用的特定操作,这就是运语言允许重新定义已有的运算符,使其完成一些只在该特定类中使用的特定操作,这就是运算符重载算符重载如用加法如用加法“”运算符进行两个复数的相加。若有运算符进行两个复数的相加。若有z1=2+3i,z2=4-8i,在数学中,可直接用,在数学中,可直接用“”实现实现z31z2,也就是将,也就是将z1和和z2的实部和虚部分别相加,的实部和虚部分别相加,z3=2+4+(3-8)6-5i。这时必须。这时必须
2、实现复数相加。比如用户可以通过定义一个函数来实现复数相加实现复数相加。比如用户可以通过定义一个函数来实现复数相加4例例4.1 通过函数实现复数相加示例。通过函数实现复数相加示例。声明复数数声明复数数:数据成员数据成员;实部实部;虚部虚部:公有函数公有函数(r=0,i=0):(r),(i)构造函数构造函数();输出复数输出复数 (1,2);复数加法复数加法;()输出复数输出复数(0)i ;虚部为负虚部为负 (0);虚部为虚部为0 “+”“i”;虚部为负虚部为负5例例4.1 通过函数实现复数相加示例。通过函数实现复数相加示例。(1 2)z(z1+z2,z1+z2)定义复数对象定义复数对象 z;返回
3、复数返回复数()主函数主函数()z1(2,3),z2(6,-5),z3;定义复数对象定义复数对象z1();输出输出z1z2();输出输出z2z3=(z1,z2);z312z3();输出输出z3();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:2+3i6-5i8-2i请按任意键继续请按任意键继续.在在()函数体中的两行代码可以用函数体中的两行代码可以用“(z1+z2,z1+z2);”代替,代替,“(z1+z2,z1+z2)”的含义是建立一个临时复数对象,它的实部为的含义是建立一个临时复数对象,它的实部为z1+z2,
4、虚部为,虚部为z1+z2,在建立临时对象的过程中调用了构造函数,语句将此临时对象作为,在建立临时对象的过程中调用了构造函数,语句将此临时对象作为函数的返回值。函数的返回值。6运算符重载运算符重载能否像实数的加法运算一样,直接用加号能否像实数的加法运算一样,直接用加号“+”来实现复数运算呢?例如在程序中直接用来实现复数运算呢?例如在程序中直接用“z312”进行运算,这需要对运算符进行运算,这需要对运算符“+”进行重载。进行重载。运算符重载的方法在实质上就是定义一个重载运算符的函数,在执行被重载的运算符时,系运算符重载的方法在实质上就是定义一个重载运算符的函数,在执行被重载的运算符时,系统将调用此
5、函数实现相应的运算。运算符重载本质就是函数的重载。统将调用此函数实现相应的运算。运算符重载本质就是函数的重载。重载运算符的函数的原型如下:重载运算符的函数的原型如下:返回值类型运算符返回值类型运算符(形参表形参表);例如将例如将“”用于类的加法运算运算符重载的函数原型可以为:用于类的加法运算运算符重载的函数原型可以为:(1,2);7例例4.2 通过运算符重载实现复数相加的示例。通过运算符重载实现复数相加的示例。编译预处理命令编译预处理命令 ;使用命名空间使用命名空间 声明复数数声明复数数:数据成员数据成员;实部实部;虚部虚部:公有函数公有函数(r=0,i=0):(r),(i)构造函数构造函数(
6、);输出复数输出复数 (1 2)(z1+z2,z1+z2);()输出复数输出复数(0)i ;虚部为负虚部为负 (0);虚部为虚部为0 +i ;虚部为负虚部为负上面的程序在上面的程序在 2005,2005,和,和 都能正常运行,但在都能正常运行,但在 6.0下会出现的编译时下会出现的编译时错语,是错语,是 6.0的一个,在的一个,在 6.0中可将:中可将:编译预处理命令编译预处理命令 ;使用命名空间使用命名空间 改为:改为:编译预处理命令编译预处理命令 包含包含()的声明的声明 8例例4.2 通过运算符重载实现复数相加的示例。通过运算符重载实现复数相加的示例。(a,b)a+b;错错,重载运算符的
7、函数的参数不能全部是的标准类型重载运算符的函数的参数不能全部是的标准类型()主函数主函数()z1(2,3),z2(6,-5),z3;定义复数对象定义复数对象z1();输出输出z1z2();输出输出z2z3=z1+z2;进行复数加法运算进行复数加法运算z3();输出输出z3();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:2+3i6-5i8-2i请按任意键继续请按任意键继续.94.2 运算符重载方式运算符重载方式10运算符重载方式运算符重载方式 的运算符按参加运算的操作数个数可分为单目运算符、双目运算符、三目运算符
8、以及不确定的运算符按参加运算的操作数个数可分为单目运算符、双目运算符、三目运算符以及不确定目数运算符目数运算符单目运算符只有一个操作数,例如(取反运算符),(负号运算符)等单目运算符只有一个操作数,例如(取反运算符),(负号运算符)等双目运算符有两个操作数参与运算,例如双目运算符有两个操作数参与运算,例如2+3(加法运算符),(赋值运运算符)等(加法运算符),(赋值运运算符)等三目运算符有三个操作数参与运算,三目运算符只包括问号运算符,行例如三目运算符有三个操作数参与运算,三目运算符只包括问号运算符,行例如不确定目数运算符是操作数个数不确定,可根据需要重载为不同的操作数个数,不确定目数不确定目
9、数运算符是操作数个数不确定,可根据需要重载为不同的操作数个数,不确定目数运算符只包括函数调用运算符运算符只包括函数调用运算符“()()”在中只能重载单目运算符、双目运算符及不确定目数运算符在中只能重载单目运算符、双目运算符及不确定目数运算符“()”114.2.1 运算符重载为类的成员函数运算符重载为类的成员函数通过该类的对象来调用运算符函数,由于对象本身将作为一个操作数,因此要求第一个操作数通过该类的对象来调用运算符函数,由于对象本身将作为一个操作数,因此要求第一个操作数的类型为用户自定义类,参数表中的参数个数比操作数个数少一。的类型为用户自定义类,参数表中的参数个数比操作数个数少一。下面是运
10、算符重载为类的成员函数的一般形式:下面是运算符重载为类的成员函数的一般形式:类名类名:数据成员数据成员:公有函数公有函数返回值类型返回值类型 运算符运算符(形参表形参表)运算符重载为类的成员函数运算符重载为类的成员函数;其中其中“运算符运算符”是运算符函数的专用函数名。是运算符函数的专用函数名。12用类的成员函数重载单目运算符用类的成员函数重载单目运算符单目运算符的运算符在一般情况下重载为类的成员函数时,形参表为单目运算符的运算符在一般情况下重载为类的成员函数时,形参表为空,以当前对象(即调用该运算符函数的对象)作为运算符唯一的操空,以当前对象(即调用该运算符函数的对象)作为运算符唯一的操作数
11、。作数。13例例4.3 单目运算符重载为类的成员函数示例。单目运算符重载为类的成员函数示例。声明整型类声明整型类:数据成员数据成员;数据值数据值:公有函数公有函数(n=0):(n)构造函数构造函数(n)=n;设置数据值设置数据值();返回数据值返回数据值()();重载负号运算符重载负号运算符“-”;()主函数主函数()i;定义整型对象定义整型对象(6);设置数据值设置数据值 ();输出数据值输出数据值6i=;对对i进行求负号运算进行求负号运算,等价于等价于();()+);()主函数主函数()i(6),j(9),k;定义整型对象定义整型对象k=i+j;对整型对象求加法运算,等价于对整型对象求加法
12、运算,等价于(j);()+()=()输出数值输出数值();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:6+9=15请按任意键继续请按任意键继续.164.2.2 运算符重载为类的友元函数运算符重载为类的友元函数可以像将运算符重载为类的友元函数,这时参数表中的参数个数与操作数个相等,并且操作数的第一可以像将运算符重载为类的友元函数,这时参数表中的参数个数与操作数个相等,并且操作数的第一个操作数的类型不要求是用户自定义类。个操作数的类型不要求是用户自定义类。下面是运算符重载为类的友元函数的一般形式:下面是运算符重载为类
13、的友元函数的一般形式:类名类名:数据成员数据成员:公有函数公有函数 返回值类型返回值类型 运算符运算符(形参表形参表)运算符重载为类的友元函数运算符重载为类的友元函数;由于是友元函数,因此在函数原型前应加上关键字。由于是友元函数,因此在函数原型前应加上关键字。17用类的友元函数重载单目运算符用类的友元函数重载单目运算符将单目运算符重载为类的友元函数时,友元函数形参表中有一个参数作为该运算符的操作数。将单目运算符重载为类的友元函数时,友元函数形参表中有一个参数作为该运算符的操作数。18例例4.5 单目运算符重载为类的友元函数示例。单目运算符重载为类的友元函数示例。编译预处理命令编译预处理命令 ;
14、使用命名空间使用命名空间 声明整型类声明整型类:数据成员数据成员;数据值数据值:公有函数公有函数(n=0):(n)构造函数构造函数(n)=n;设置数据值设置数据值();返回数据值返回数据值 ()重载负号运算符重载负号运算符-();在在 6.0下会出现的编译时错语,是下会出现的编译时错语,是 6.0的一个,在的一个,在 6.0中可将:中可将:编译预处理命令编译预处理命令 ;使用命名空间使用命名空间 改为:改为:编译预处理命令编译预处理命令 包含包含()的声明的声明 19例例4.5 单目运算符重载为类的友元函数示例。单目运算符重载为类的友元函数示例。()主函数主函数()i;定义整型对象定义整型对象
15、(6);设置数据值设置数据值 ();输出数据值输出数据值i=;对对i进行求负号运算进行求负号运算,等价于等价于(i);();输出数据值输出数据值();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:6-6请按任意键继续请按任意键继续.20用类的友元函数重载双目运算符用类的友元函数重载双目运算符将双目运算符重载为类的友元函数时,友元函数形参表中包含有两个参数,这两个参数分别将双目运算符重载为类的友元函数时,友元函数形参表中包含有两个参数,这两个参数分别作为运算符的左、右操作数。作为运算符的左、右操作数。21例例4.6
16、双目运算符重载为类的友元函数示例。双目运算符重载为类的友元函数示例。编译预处理命令编译预处理命令 ;使用命名空间使用命名空间 声明整型类声明整型类:数据成员数据成员;数据值数据值:公有函数公有函数(n=0):(n)构造函数构造函数(n)=n;设置数据值设置数据值();返回数据值返回数据值 (,)(+);重载重载+,两个操作数都是对象两个操作数都是对象 (a,)(a+);重载重载+,第一操作数是标准类型第一操作数是标准类型 (&a,b)(+b);重载重载+,第二操作数是标准类型第二操作数是标准类型;在在 6.0下会出现的编译时错语,是下会出现的编译时错语,是 6.0的一个,在的一个,在 6.0中
17、可将:中可将:编译预处理命令编译预处理命令 ;使用命名空间使用命名空间 改为:改为:编译预处理命令编译预处理命令 包含包含()的声明的声明 22例例4.6 双目运算符重载为类的友元函数示例。双目运算符重载为类的友元函数示例。()主函数主函数()i(6),j(9),k;定义整型对象定义整型对象k=i+j;等价于等价于(),两个操作数都是对象两个操作数都是对象 ()+()=();k=1+j;1等价于等价于(1),第一操作数是标准类型第一操作数是标准类型 1 +()=()输出数值输出数值k=i+2;2等价于等价于(i,2),第二操作数是标准类型第二操作数是标准类型 ()+2 =()输出数值输出数值(
18、);输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:6+9=151+9=106+2=8请按任意键继续请按任意键继续.234.2.3 运算符重载为普通函数运算符重载为普通函数可以将运算符重载为普通函数,这时参数表中的参数个数与操作数个相等,并且第一个操作可以将运算符重载为普通函数,这时参数表中的参数个数与操作数个相等,并且第一个操作数的类型不要求是用户自定义类。数的类型不要求是用户自定义类。下面是运算符重载为普通函数的一般形式:下面是运算符重载为普通函数的一般形式:返回值类型返回值类型 运算符运算符(形参表形参表);由
19、于是普通函数,因此在函数原型前不应加上关键字。由于是普通函数,因此在函数原型前不应加上关键字。24用普通函数重载单目运算符用普通函数重载单目运算符将单目运算符重载为普通函数时,函数形参表中有一个参数作为该运算符的操作数。将单目运算符重载为普通函数时,函数形参表中有一个参数作为该运算符的操作数。25例例4.7 单目运算符重载为类的普通函数示例。单目运算符重载为类的普通函数示例。声明整型类声明整型类:数据成员数据成员;数据值数据值:公有函数公有函数(n=0):(n)构造函数构造函数(n)=n;设置数据值设置数据值();返回数据值返回数据值;()重载负号运算符重载负号运算符-();()主函数主函数(
20、)i;定义整型对象定义整型对象(6);设置数据值设置数据值 ();输出数据值输出数据值6i=;对对i进行求负号运算进行求负号运算,等价于等价于(i);();输出数据值输出数据值-6();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统26用普通函数重载重载双目运算符用普通函数重载重载双目运算符将双目运算符重载为普通函数时,函数形参表中包含有两个参数,这两个参数分别作为运算将双目运算符重载为普通函数时,函数形参表中包含有两个参数,这两个参数分别作为运算符的左、右操作数。符的左、右操作数。27例例4.8 双目运算符重载为普通函数示例。双目运算符重载为普通函数示例。声明
21、整型类声明整型类:数据成员数据成员;数据值数据值:公有函数公有函数(n=0):(n)构造函数构造函数(n)=n;设置数据值设置数据值();返回数据值返回数据值;(,)重载运算符重载运算符+()+();()主函数主函数()i(6),j(9),k;定义整型对象定义整型对象k=i+j;对整型对象求加法运算,等价于对整型对象求加法运算,等价于()()+()=();();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:6+9=15请按任意键继续请按任意键继续.28运算符重载运算符重载一般地讲,单目运算符最好重载为类的成员函数,
22、双目运算符最好重载为类的友元函数或普一般地讲,单目运算符最好重载为类的成员函数,双目运算符最好重载为类的友元函数或普通函数。通函数。29*4.3 典型运算符重载典型运算符重载 30*4.3.1 重载赋值运算符重载赋值运算符“=”由于赋值运算符重载后实现将一个表达式的值赋值给用户自定义对象,也就是赋值运算符的由于赋值运算符重载后实现将一个表达式的值赋值给用户自定义对象,也就是赋值运算符的第一个操作数是类型为用户自定义类的对象,因此规定赋值运算符第一个操作数是类型为用户自定义类的对象,因此规定赋值运算符“=”只能重载为类的成员只能重载为类的成员函数,一般重载格式为:函数,一般重载格式为:类名类名
23、类名类名(类名类名&源对象源对象)(&源对象源对象)目的对象与源对象不是同一个对象目的对象与源对象不是同一个对象 复制被被赋值对象复制被被赋值对象*;返回目的对象返回目的对象31*重载赋值运算符重载赋值运算符“=”如用户没有为一个类重载赋值运算符,编译程序将生成一个默认赋值运算符函数。赋值运算如用户没有为一个类重载赋值运算符,编译程序将生成一个默认赋值运算符函数。赋值运算把源对象的数据成员逐个地复制到目的对象的相应数据成员把源对象的数据成员逐个地复制到目的对象的相应数据成员对于一般的类,使用默认赋值运算符函数都能正常地工作,但当一个类中包含有指针类型的对于一般的类,使用默认赋值运算符函数都能正
24、常地工作,但当一个类中包含有指针类型的数据成员,并且通过指针在构造函数中动态申请了存储空间,在析构函数中通过指针释放了数据成员,并且通过指针在构造函数中动态申请了存储空间,在析构函数中通过指针释放了动态存储空间,这种情况可能会出现运行时错误动态存储空间,这种情况可能会出现运行时错误32例例4.9 使用赋值运算符出现运行时错误的示例。使用赋值运算符出现运行时错误的示例。:数据成员数据成员*;串值串值:公有成员公有成员(*s=)构造函数构造函数(s )s=;将空指针转化为空串将空指针转化为空串=(s)+1;分配存储空间分配存储空间(,s);复制串值复制串值()复制构造函数复制构造函数=()+1 分
25、配空间分配空间(,);复制串值复制串值();析构函数析构函数();显示串显示串;33例例4.9 使用赋值运算符出现运行时错误的示例。使用赋值运算符出现运行时错误的示例。()主函数主函数()s1(),s2;定义对象定义对象s2=s1;使用默认赋值运算符函数使用默认赋值运算符函数s1();显示串显示串s1s2();显示串显示串s2();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:请按任意键继续请按任意键继续.当用户按任一键时,屏幕将会显示类似当用户按任一键时,屏幕将会显示类似 !的错误的错误 在和在和 环境中没有出上
26、述错误现环境中没有出上述错误现象,原因是在发现释放一个已释放的空间时,不再作释放操象,原因是在发现释放一个已释放的空间时,不再作释放操作,也不作异常处理作,也不作异常处理 34在执行在执行“s1();”语句时,构造函数动态地分配存储空间,并将返回的地址赋给对象语句时,构造函数动态地分配存储空间,并将返回的地址赋给对象s1的数据成员,的数据成员,然后把然后把“”“”拷贝到这块空间中拷贝到这块空间中执行语句执行语句“s2=s1;”时,由于没有为类重载赋值运算符,系统将调用默认赋值运算符函数,负责将对时,由于没有为类重载赋值运算符,系统将调用默认赋值运算符函数,负责将对象象s1的数据成员中存放的地址
27、值赋值给对象的数据成员中存放的地址值赋值给对象s2的数据成员的数据成员对象对象s1复制给对象复制给对象s2的仅是其数据成员的值,并没有把指向的动态存储空间进行复制,当遇到对象的仅是其数据成员的值,并没有把指向的动态存储空间进行复制,当遇到对象的生命期结束需要撤销对象时,首先由的生命期结束需要撤销对象时,首先由s2对象调用析构函数,将成员所指向的字符串对象调用析构函数,将成员所指向的字符串“”“”所在的动态所在的动态空间释放空间释放在对象在对象s1自动调用析构函数之前,对象自动调用析构函数之前,对象s1的数据成员指向已释放的内存空间,因此在的数据成员指向已释放的内存空间,因此在s1调用析构函调用
28、析构函数时,无法正确执行析构函数代码数时,无法正确执行析构函数代码“”,从而导致出错。,从而导致出错。35重载赋值运算符解决问题重载赋值运算符解决问题应重载赋值运算符,复制指针数据成员所指向的动态空间中的内容。这样,两个对象的指应重载赋值运算符,复制指针数据成员所指向的动态空间中的内容。这样,两个对象的指针成员就拥有不同的地址值,指向不同的动态存储空间针成员就拥有不同的地址值,指向不同的动态存储空间36例例4.10 重载赋值运算符避免例重载赋值运算符避免例4.9使用默认赋值运算符的副作用。使用默认赋值运算符的副作用。:数据成员数据成员*;串值串值:公有成员公有成员(*s=)构造函数构造函数(s
29、 )s=;将空指针转化为空串将空指针转化为空串=(s)+1 分配存储空间分配存储空间(,s);复制串值复制串值()复制构造函数复制构造函数=()+1 分配空间分配空间(,);复制串值复制串值();重载赋值运算符重载赋值运算符();析构函数析构函数();显示串显示串;37例例4.10 重载赋值运算符避免例重载赋值运算符避免例4.9使用默认赋值运算符的副作用。使用默认赋值运算符的副作用。()重载赋值运算符重载赋值运算符()目的对象与源对象不是同一个对象目的对象与源对象不是同一个对象=()+1 分配空间分配空间(,)复制串值复制串值*;返回目的对象返回目的对象()主函数主函数()s1(),s2;定义
30、对象定义对象s2=s1;使用重载赋值运算符使用重载赋值运算符s1();显示串显示串s1s2();显示串显示串s2();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:请按任意键继续请按任意键继续.384.3.2 重载自增重载自增1运算符运算符“”“”和自减和自减1运算符运算符“”“”这两个运算符还有前缀和后缀的差别,和是前缀使用方式,和是后缀使用方式这两个运算符还有前缀和后缀的差别,和是前缀使用方式,和是后缀使用方式在当前的标准中,对此作了特殊约定,对于前缀使用方式,与一般单目运符的重载方式相同,对于在当前的标准中,
31、对此作了特殊约定,对于前缀使用方式,与一般单目运符的重载方式相同,对于后缀使用方式,在进行运算符的重载函数中增加一个整型参数具体重载函数的声明格式如下:后缀使用方式,在进行运算符的重载函数中增加一个整型参数具体重载函数的声明格式如下:类名类名();前缀前缀“”“”重载为类的成员函数重载为类的成员函数 类名类名();后缀后缀“”“”重载为类的成员函数重载为类的成员函数 类名类名();前缀前缀“”“”重载为类的成员函数重载为类的成员函数 类名类名();后缀后缀“”“”重载为类的成员函数重载为类的成员函数 类名类名(类名类名&);前缀前缀“”“”重载为类的友元函数重载为类的友元函数 类名类名(类名类
32、名&,);后缀后缀“”“”重载为类的友元函数重载为类的友元函数 类名类名(类名类名&);前缀前缀“”“”重载为类的友元函数重载为类的友元函数 类名类名(类名类名&,);后缀后缀“”“”重载为类的友元函数重载为类的友元函数 类名类名(类名类名&);前缀前缀“”“”重载为普通函数重载为普通函数 类名类名(类名类名&,);后缀后缀“”“”重载为普通函数重载为普通函数 类名类名(类名类名&);前缀前缀“”“”重载为普通函数重载为普通函数 类名类名(类名类名&,);后缀后缀“”“”重载为普通函数重载为普通函数39例例4.11重载自增重载自增1运算符运算符“”“”和自减和自减1运算符运算符“”“”示例。示
33、例。:数据成员数据成员;数据值数据值:公有函数公有函数(n=0):(n)构造函数构造函数(n)=n;设置数据值设置数据值();返回数据值返回数据值()();前缀前缀“(i)();后缀后缀 ()前缀前缀 ();(,i)重载后缀为普通函数重载后缀为普通函数 =a;用暂存用暂存aa=()-1);a的值减的值减1;返回返回a原来的值原来的值,也就是也就是40例例4.11重载自增重载自增1运算符运算符“”“”和自减和自减1运算符运算符“”“”示例。示例。()主函数主函数()i,j;定义整型对象定义整型对象(6);设置数据值设置数据值j=;对对i作前缀自增作前缀自增1运算等价于运算等价于()(),();输
34、出数据值输出数据值7,7(6);设置数据值设置数据值j=;对对i作后缀自增作后缀自增1运算等价于运算等价于(0)(),();输出数据值输出数据值7,6(6);设置数据值设置数据值j=;对对i作前缀自减作前缀自减1运算等价于运算等价于(i)(),();输出数据值输出数据值5,5(6);设置数据值设置数据值j=;对对i作后缀自减作后缀自减1运算等价于运算等价于(i,0)(),();输出数据值输出数据值5,6();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统41*4.3.3 重载下标运算符重载下标运算符“”下标运算符下标运算符“”一般用于在数组中标识数组元素的位置,
35、在语言中,下标运算符一般用于在数组中标识数组元素的位置,在语言中,下标运算符“”是没是没有越界检查功能的。可以通过重载下标运算符有越界检查功能的。可以通过重载下标运算符“”实现一种更安全、功能更强的数组类实现一种更安全、功能更强的数组类型型下标运算符的使用方式是下标运算符的使用方式是ai,第一个操作数为数组名,重载后就为用户自定义对象,因此,第一个操作数为数组名,重载后就为用户自定义对象,因此规定重载下标运算符规定重载下标运算符“”只能重载为类的成员函数。定义下标运算符只能重载为类的成员函数。定义下标运算符“”的函数重载的函数重载的一般声明格式如下:的一般声明格式如下:返回值类型返回值类型 (
36、);42例例4.12 重载下标运算符重载下标运算符“”示例。示例。声明数组类模板声明数组类模板 :数据成员数据成员*;存储数据元素值存储数据元素值;数组元素个数数组元素个数:公有函数公有函数():()=;构造函数构造函数();析构函数析构函数(i)下标运算符下标运算符重载为成员函数重载为成员函数(i=)元素位置错元素位置错!;(1);退出程序的运行退出程序的运行,返回到操作系统返回到操作系统 i;返回返回i;43例例4.12 重载下标运算符重载下标运算符“”示例。示例。()主函数主函数()a=1,9,7,5,6,3;定义数组定义数组a n=6;数组元素个数数组元素个数(n);定义数组对象定义数
37、组对象 i;定义临时变量定义临时变量(i=0;i n;)i=ai i等价于等价于i(i=0;i n;)i 输出元素值输出元素值 ;换行换行();输出系统提示信息输出系统提示信息 0;返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出如下:程序运行时屏幕输出如下:1 9 7 5 6 3请按任意键继续请按任意键继续.44*4.3.4 重载函数调用运算符重载函数调用运算符“()()”重载函数调用运算符重载函数调用运算符“()()”的用途是使类的对象可以象函数名称一样使用,运算符的用途是使类的对象可以象函数名称一样使用,运算符“()()”是通过用户自定义对象来调用函数,也就是用户自定义对象是第
38、一个操作数,因此规定函数是通过用户自定义对象来调用函数,也就是用户自定义对象是第一个操作数,因此规定函数调用运算符调用运算符“()()”只能重载为类的成员函数,具体声明格式如下:只能重载为类的成员函数,具体声明格式如下:返回值类型返回值类型()(形参表形参表);在在C 中,由于上面的声明格式中形参表的参数个数不确定,因此中,由于上面的声明格式中形参表的参数个数不确定,因此“()()”是不确定目数运是不确定目数运算符算符45例例4.13 重载下标运算符重载下标运算符“”示例。示例。声明数组类模板声明数组类模板 :数据成员数据成员*;存储数据元素值存储数据元素值;数组元素个数数组元素个数:公有函数
39、公有函数():()=;构造函数构造函数();析构函数析构函数()(i)函数调用运算符只能重载为成员函数函数调用运算符只能重载为成员函数(i=)元素位置错元素位置错!;(1);退出程序的行运退出程序的行运,返回到操作系统返回到操作系统 i;返回返回i;46例例4.13 重载下标运算符重载下标运算符“”示例。示例。()主函数主函数()a=1,9,7,5,6,3;定义数组定义数组a n=6;数组元素个数数组元素个数(n);定义数组对象定义数组对象 i;定义临时变量定义临时变量(i=0;i n;)(i)=ai(i)等价于等价于(i)(i=0;i n;)(i);输出元素值输出元素值”和输出运算符和输出运
40、算符“”和输出运算符和输出运算符“”就能对标准类型数据进行输入和输出。就能对标准类型数据进行输入和输出。对于用户自定义的对象,是不能直接用对于用户自定义的对象,是不能直接用“”来进行输出和输入的。如果要用它们输出和来进行输出和输入的。如果要用它们输出和输入自定义的对象,必须对它们进行重载。输入自定义的对象,必须对它们进行重载。输入运算符输入运算符“”和输出运算符和输出运算符“(&,类名类名&);重载友元函数重载友元函数 (&,类名类名&);重载为普通函数重载为普通函数”和和“”和输出运算符和输出运算符“”和输出运算符和输出运算符“(,)重载输入运算符重载输入运算符 r,i;表示实部表示实部(r
41、)和虚部和虚部(i)r;输入实部输入实部 i;输入虚部输入虚部(r);设置实部设置实部(i);设置虚部设置虚部;返回输入流对象返回输入流对象(,)重载运算符重载运算符()0)()()i;虚部为负虚部为负 ()0)();虚部为虚部为0 ()+()”和输出运算符和输出运算符“z;/输入输入z,cin z等价于等价于operator(cin,z)cout z endl;/输出输出z,coutz等价于等价于operator(cout,z)system(PAUSE);/输出系统提示信息输出系统提示信息return 0;/返回值返回值0,返回操作系统返回操作系统程序运行时屏幕输出参考如下:程序运行时屏幕输出参考如下:输入实部输入实部:6输入虚部输入虚部:86+8i请按任意键继续请按任意键继续.51谢谢大家!