运算符重载与友元.ppt_第1页
运算符重载与友元.ppt_第2页
运算符重载与友元.ppt_第3页
运算符重载与友元.ppt_第4页
运算符重载与友元.ppt_第5页
已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论