已阅读5页,还剩51页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第6章 运算符重载与友元 *1第6章运算符重载与友元 内容提要 q运算符重载的目的、定义和实质 q运算符重载的规则 q运算符重载的两种形式 q友元的作用和定义 Date2第6章运算符重载与友元 提出问题 复数的加减运算问题: 对于非基本数据类型,如复数、分数,如何在 程序中进行运算? 能否直接用运算符(+、-、*、/)进行运算? Date3第6章运算符重载与友元 分析问题 自定义一个复数类Complex完成复数的加减运算 设计复数类 class Complex/复数类 public: Complex(double r=0.0,double i=0.0) /构造函数 real=r; image=i; private: double real, image; /定义实部、虚部 ; Date4第6章运算符重载与友元 思考 是否能通过下面的代码完成复数的加减运算: int main() /定义一个复数对象c1,其实部为2,虚部为2.5 Complex c1(2, 2.5); Complex c2(3, 1.4); Complex c3, c4; c3 = c1 + c2; c4 = c1 - c2; return 0; Date5第6章运算符重载与友元 编译程序,显示: Date6第6章运算符重载与友元 说明 C+预预定义义的“+”、“-”运算只支持基本 数据类类型,并不支持用户自定义类类型。 复数类类的加减运算不能采用系统预统预 定义义的 运算符“+”、“-”完成,那么编编写成员员 函数来实现实现 加、减运算。 Date7第6章运算符重载与友元 重新设计复数类Complex class Complex public: Complex(double r=0.0,double i=0.0) /构造函数 real=r; image=i; double Real()return real; /返回复数的实部 double Imag()return image;/返回复数的虚部 Complex add(Complex /函数重载,实现复数加复数 Complex add(double d); /函数重载,实现复数加实数 Complex sub(Complex /函数重载,实现复数减复数 Complex sub(double d); /函数重载,实现复数减实数 void set_value(Complex /函数重载,实现复数对象的赋值 private: double real, image; /定义实部、虚部 ; Date8第6章运算符重载与友元 完成复数与复数相加 Complex Complex:add(Complex temp.real = real + c.real; temp.image = image + c.image; return temp; 成员函数定义 Date9第6章运算符重载与友元 完成复数与实数相加 Complex Complex:add(double d) Complex temp; temp.real = real + d; temp.image = image; return temp; 完成复数与复数相减 Complex Complex:sub(Complex temp.real = real - c.real; temp.image = image - c.image; return temp; Date10第6章运算符重载与友元 完成复数与实数相减 Complex Complex:sub(double d) Complex temp; temp.real = real - d; temp.image = image; return temp; 完成复数间的赋值运算 void Complex:set_value(Complex image = c.image; Date11第6章运算符重载与友元 int main() Complex c1(2, 2.5); Complex c2(3, 1.4); Complex c3, c4; c3.set_value(c1.add(c2); c4.set_value(c1.sub(c2); cout :operator () ; Date14第6章运算符重载与友元 在复数类中重载运算符 class Complex/复数类 public: Complex(double r=0.0,double i=0.0)real=r;image=i; const double Real()return real; const double Imag()return image; Complex operator+( Complex Complex operator+( double d); /重载运算符“+” Complex operator-( Complex /重载运算符“-” Complex operator-( double d); /重载运算符“-“ void operator=(Complex /重载运算符“=” private: double real,image; ; Date15第6章运算符重载与友元 operator是进行运算符重载的关键字 是该运算符涉及的操作数 运算符重载为成员函数最多有一个形参 运算符重载的实质就是函数重载,只不过函数名 换成了关键字operator和具体要重载的运算符了 但是运算符重载也有别于函数重载,运算符重载 的函数参数就是该运算符涉及的操作数,因此运 算符重载在参数个数上是有限制的,这是它不同 于函数重载之处。 说明 Date16第6章运算符重载与友元 例6-2 #include using namespace std; class MyString public: MyString(const char * = 0); /定义构造函数 MyString(const MyString /定义复制构造函数 MyString(); /释放字符元素所占空间 unsigned int length(); /求字符串长度 char * c_str(); /取得该字符串 MyString /重载运算符= MyString char /重载运算符 bool operator =(const MyString /重载运算符= bool operator =(const char *); private: unsigned int len; /字符串所占空间大小 char *elems; /字符串中的字符元素集合 ; Date17第6章运算符重载与友元 MyString:MyString(const MyString elems = new charsize; strcpy( elems, str.elems); len = size-1; 赋值构造函数 Date18第6章运算符重载与友元 重载operator= MyString delete elems; elems = new charlen+1; strcpy( elems, obj.elems); return *this; Date19第6章运算符重载与友元 重载operator= MyString delete elems; elems = 0; else len = strlen(pstr); delete elems; elems = new charlen+1; strcpy( elems,pstr); return *this; Date20第6章运算符重载与友元 重载operator /返回第i个位置的字符 char friend class ; 友元的定义 Date29第6章运算符重载与友元 例6-3 class MyString; bool operator=( const MyString bool operator=( const char *, const MyString bool operator=( const MyString class MyString public: MyString(const char * = 0); /定义构造函数 MyString(const MyString /定义复制构造函数 MyString(); /释放字符元素所占空间 unsigned int length(); /求字符串长度 char * c_str(); /取得该字符串 friend bool operator=( const MyString friend bool operator=( const char *, const MyString friend bool operator=( const MyString private: unsigned int len; /字符串所占空间大小 char *elems; /字符串中的字符元素集合 ; Date30第6章运算符重载与友元 bool operator=( const MyString return str1.len str2.len ? false : true; bool operator=( const char *str1, const MyString return strlen(str1) str2. len ? false : true; bool operator=( const MyString return str1.len strlen(str2) ? false : true; Date31第6章运算符重载与友元 int main() MyString s(“How are you?“); if(“How“ = s) cout #include using namespace std; class date; /类的前向声明 class student public: student(char *pid, char *pname, char *pdept) id = pid; name = pname; dept = pdept; void display(date private: string id; string name; string dept; ; Date34第6章运算符重载与友元 class date friend class student; /友元类声明 public: date(int y = 2000,int m = 1,int d = 1) : year(y),month(m),day(d) private: int year; int month; int day; ; Date35第6章运算符重载与友元 void student:display(date x=i;y=j;z=k; s=(x+y+z)/2.0; area=sqrt(s*(s-x)*(s-y)*(s-z); void disparea() cout、-*必须为成员函数 +=、=、/=、*=、=、 class Clock /时钟类 public: Clock(int NewH=0,int NewM=0,int NewS=0); void ShowTime(); void operator+(); /前缀运算符重载函数的声明 /后缀运算符重载函数,加int参数以示区分 void operator+(int); private: int Hour,Minute,Second; ; Date42第6章运算符重载与友元 void Clock:operator+() /前缀单目运算符重载函数的实现 Second+; if(Second=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; cout=60) Second=Second-60; Minute+; if(Minute=60) Minute=Minute-60; Hour+; Hour=Hour%24; cout头文件中。在实际应用中,用户 只需要将此头文件包含到源程序文件中即可。 对于任何形参,如果仅需要从函数中读而不改变它,默认 地应该作为const引用来传递它。 所有赋值运算均改变左值(左值是可以被赋值的表达式, 位于赋值语句的左侧),因此,所以赋值运算的返回值对 于左值应该是非常量引用。 说明 Date50第6章运算符重载与友元 举一反三 #include using namespace std; class RMB /定义人民币类RMB public: RMB(double value=0.0) /构造函数 yuan=(int)value; jiao=(int)(value-yuan)*10); fen=(int)(value*100-yuan*100-jiao*10); void print() coutyuan“元“jiao“角“fen“分“endl; operator double() /重载类型转换运算符double,没有函数值类型 return yuan + jiao*0.1 + fen*0.01; private: int yuan,jiao,fen; ; Date51第6章运算符重载与友元 int main() RMB a(3.45),b(2.11); /定义2个RMB类的对象a、b /将两个对象a、b强制转换为实数,再相加,结果用于初始化对象c RMB c=RMB(double)a+(double)b); a.print(); b.print(); c.print(); re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 供排水工程挂靠合同
- 2024年《经济法》核心要点解析
- 2024年教案设计:《蜀道难》理解指南
- 2024冬日校园安全演讲稿(33篇)
- 2024年白公鹅养殖技术研究与市场前景预测
- 面向2024:《好的故事》教学课件的创新设计
- 2024年安全生产培训记录表:记录与管理的结合
- 《接触网施工》课件 4.7.1 线索调整
- 2024年5S培训:提高工作场所的安全性
- 2024个人信贷工作计划5篇
- 国企两书一协议参考范本
- 2024年安徽省滁州市琅琊区城市管理行政执法局招聘15人历年高频难、易错点500题模拟试题附带答案详解
- 生成式人工智能数据安全风险及其应对
- 短途调味品运输合同范本
- 畜禽解剖生理5消化系统课件
- 实验室定期自查制度
- 建设施工合同书证据目录
- 7 中华民族一家亲 互相尊重 守望相助 教学设计-2024-2025学年道德与法治五年级上册统编版
- 中医疫病防治
- 2024九年级英语下册 Unit 7 Work for PeaceLesson 39 Having Good Relationships in Your Community教学设计(新版)冀教版
- 《深海》中的色彩叙事与镜像阐释
评论
0/150
提交评论