34运算符重载

上传人:飞*** 文档编号:2500559 上传时间:2017-07-24 格式:PPT 页数:13 大小:698KB
返回 下载 相关 举报
34运算符重载_第1页
第1页 / 共13页
34运算符重载_第2页
第2页 / 共13页
34运算符重载_第3页
第3页 / 共13页
34运算符重载_第4页
第4页 / 共13页
34运算符重载_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《34运算符重载》由会员分享,可在线阅读,更多相关《34运算符重载(13页珍藏版)》请在金锄头文库上搜索。

1、3.4 运算符重载3.4.1 运算符重载的语法3.4.2 友元重载3.4.3 转换函数3.4.4 赋值运算符的重载3.4.5 增1和减1运算符的重载,3.4.1运算符重载的语法 为了重载运算符,必须定义一个特殊的函数,以便通知编译器,遇到该重载运算符时调用该函数,并由该函数来完成该运算符应该完成的操作。这种函数称为运算符重载函数,通常是类的成员函数或是友元函数,运算符的操作数通常也是该类的对象。定义一个运算符重载函数函数名必须以operator开头,一般形式如下::operator () / 函数体重载的运算符必须是一个合法的运算符,如“+”、“-”、“*”、“/”、“+”等。例Ex_Comp

2、lex 运算符的简单重载。#include using namespace std;class CComplex public: CComplex(double r = 0, double i = 0) realPart = r; imagePart = i; void print() cout该复数实部 = realPart, 虚部 = imagePartendl; CComplex operator + (CComplex &c);/ 重载运算符+ CComplex operator + (double r);/ 重载运算符+ private: double realPart;/ 复数的实

3、部 double imagePart; ;,3.4运算符重载,CComplex CComplex:operator + (CComplex &c) / 参数是CComplex引用对象CComplex temp;temp.realPart = realPart + c.realPart;temp.imagePart = imagePart + c.imagePart;return temp;CComplex CComplex:operator + (double r)/ 参数是double类型数据CComplex temp;temp.realPart = realPart + r;temp.im

4、agePart = imagePart;return temp;void main()CComplex c1(12,20), c2(50,70), c;c = c1 + c2;c.print();c = c1+ 20;c.print();char a10;cin.getline(a,sizeof(a);,3.4运算符重载,运行结果:该复数实部 = 62, 虚部 = 90该复数实部 = 32, 虚部 = 20,还需要说明的是:(1) 当用成员函数实现双目运算符的重载时,运算符的左操作数一定是对象,右操作数作为调用运算符重载函数的参数,参数可以是对象、对象的引用或是其他类型的参数。例如,若有表达式

5、“c = 20 + c1”,则编译器必将“20 + c1”解释为“20.operator + (c1)”,显然出现编译错误。但实际应用时,这种运算操作是存在的,解决这个问题的办法是将运算符重载为友元函数(在后面讨论)。(2)不是所有的运算符都可以重载。在C+中不允许重载的运算符除三目运算符“?:”外,还有成员操作符“.”、成员指针操作符“*”、作用域操作符“:”以及sizeof运算符。(3)只能对C+中已定义了的运算符进行重载,而且当重载一个运算符时,该运算符的操作数个数、优先级和结合性是不能改变的。,3.4运算符重载,3.4.2友元重载 实现运算符重载的方法有两种:用类的成员函数来实现和通过

6、类的友元函数来实现。这里来用友元函数实现重载的方法。友元重载方法既可用于单目运算符,也可以用于双目运算符。它们的一般格式如下:friend operator ()/ 单目运算符重载 / 函数体friend operator ()/ 双目运算符重载 / 函数体 对于单目运算符的友元重载函数来说,只有一个形参,形参类型可能是类的对象,也可能是引用,这取决于不同的运算符。对于“+”、“-”,这个形参类型是类的引用,对于“-”(负号运算符),形参类型可以是类的引用,也可以是类的对象。对于双目运算符的友元重载函数来说,它有两个形参。这两个形参中必须有一个是类的对象需要说明的是,有些运算符是不能重载为友元

7、函数的,它们是:=、()、和-。,3.4运算符重载,3.4.3转换函数 类型转换是将一种类型的值映射为另一种类型的值。类型转换包含自动隐含和强制转换的两种方法。转换函数是实现强制转换的手段之一,它是类中定义的一个非静态成员函数,其一般格式为;class public: operator (); 是要转换后的数据类型,可以是基本的数据类型,也可以是导出的数据类型。operator和一起构成了转换函数名。这个转换函数的作用是将“class”声明的类对象转换成指定的数据类型。,3.4运算符重载,例Ex_Money 转换函数的使用。#include using namespace std;typede

8、f char* mystring;class CMoney public:CMoney(double a = 0.0) amount = a; operator mystring (); private:double amount;CMoney:operator mystring ()char basestr153 = 分,角,元,拾,佰,仟,万, 拾,佰,仟,亿,拾,佰,仟,万; char datastr103 = 零,壹,贰,叁,肆,伍,陆,柒,捌,玖;static char strResult80;double temp, base = 1.0;int n = 0;temp = amou

9、nt * 100.0;strcpy(strResult, 金额为: ); if (temp = 10.0)base = base * 10.0; /计算位数temp = temp / 10.0;n+;if (n=15) strcpy(strResult, 金额超过范围!);else temp = amount * 100.0;for (int m=n; m=0; m-) int d = (int)(temp / base);temp = temp - base*(double)d;base = base / 10.0;strcat(strResult, datastrd);strcat(str

10、Result, basestrm);return strResult;void main()CMoney money(1234123456789.123);cout(mystring)moneyendl;char a10;cin.getline(a,sizeof(a);,3.4运算符重载,运行结果:金额为: 壹万贰仟叁佰肆拾壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖元壹角贰分,3.4.4赋值运算符的重载 相同类型的对象之间可以直接相互赋值,不是所有的同类型对象都可以这么操作的。对象的成员中有数组或动态的数据类型时,就不能直接相互赋值,否则在程序的编译或执行过程中出现编译或运行错误。例如:class C

11、demopublic:CDemo(char *s)ps = new charstrlen(s) + 1;strcpy(ps, s);CDemo()if (ps) delete ps;void print()coutpsendl;private:char *ps;void main()CDemo d1(Key), d2(Mouse);d1 = d2;程序运行到“d1 = d2”时发生运行错误。因此,必须重载“=”运算符,,3.4运算符重载,例Ex_Evaluate 赋值运算符的重载。#include #include using namespace std;class Cdemopublic:

12、Cdemo(char *s) ps = new charstrlen(s) + 1;strcpy(ps, s);Cdemo& operator = (Cdemo &a)/ 赋值运算符重载if (ps) delete ps;if (a.ps) ps = new charstrlen(a.ps) + 1;strcpy(ps, a.ps); else ps = 0;return *this; void print() coutpsendl;private:char *ps;void main()Cdemo d1(Key), d2(Mouse); d1 = d2; d1.print(); char a

13、10; cin.getline(a,sizeof(a); ,3.4运算符重载,运行结果:mouse,需要说明的是:(1)赋值运算符重载函数operator = ()的返回类型是CDemo&,注意它返回是类的引用而不是对象。这是因为,C+要求赋值表达式左边的表达式是左值,它能进行诸如下列的运算:int x, y = 5;(x = y)+;/ 结果x为6由于引用的实质就是对象的地址,所以通过引用当然可以改变对象的值。而如果返回的类型是类的对象,则被认为是一个常量,不能出现在等号左边作为左值(也就是说不能被改变)。(2)赋值运算符不能重载为友元函数,只能是一个非静态成员函数。(3) 赋值运算符是唯一

14、的一个不能被继承的运算符函数。,3.4运算符重载,3.4.5增1和减1运算符的重载 增1“+”和减1“-”运算符是单目运算符,有前缀和后缀运算符两种。为了区分这两种运算符,在重载时将后缀运算符视为双目运算符。即obj+或obj-被看作为:obj+0或obj-0 例Ex_IncrementAndDecrement “+”和“”运算符的重载。#include using namespace std;class CCounterpublic: CCounter() unCount =0; CCounter operator +(); CCounter operator +(int); void print() coutunCountendl; private: unsigned unCount;,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号