c6自定义类型的运算.ppt_第1页
c6自定义类型的运算.ppt_第2页
c6自定义类型的运算.ppt_第3页
c6自定义类型的运算.ppt_第4页
c6自定义类型的运算.ppt_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第六章 自定义类型的运算,沈阳工程学院 刘晓慧,C+语言程序设计,2,本节主要内容,用函数实现对象的运算 运算符重载函数,3,教学目的:,了解利用成员函数和友元函数对类对象进行运算的方法; 理解运算符重载的概念、意义和原则; 掌握运算符重载为类的成员函数和友元函数方法及调用运算符重载函数的方法。 重点: 运算符重载的概念和意义; 运算符重载的方法。 难点: 运算符重载的方法 教具: ppt课件、多媒体教学软件 教学过程: 问题引入、内容讲解、练习、小结,4,6.1 用函数实现对象的运算,对于用户自定义的数据类型,有时需要对数据进行某种运算等操作,而系统只对基本数据类型提供了运算规则,无法完成复杂数据的运算,因此需要我们自己定义运算规则,定义方法有两种:一是通过定义函数对复杂数据进行运算规则限制;二是对现有运算符进行修改,即运算符重载。 采用函数进行运算规则定义时可将函数定义为类成员函数或友元函数。成员函数实现运算的优点是:函数中可方便地访问对象中的私有成员且保证数据安全。,用函数实现对象的运算,5,例6-1:实现复数的加法运算用成员函数,#include using namespace std; class Complex /定义复数类 protected: double real; /复数的实部 double image; /复数的虚部 public: Complex(double r = 0.0, double i = 0.0) real = r; image = i; Complex add(Complex c); /复数与复数相加的函数 Complex add(double r); /复数与实数相加的函数 void output(); /用于输出复数的函数 ;,用函数实现对象的运算,6,例6-1:实现复数的加法运算用成员函数,Complex Complex:add(Complex c) /两个复数相加,一个参数,为什么? return Complex(real + c.real, image + c.image); /函数中对两个复数对象的实部和虚部相加,将相加的结果作为新的实部和虚部利用构造函数重新定义一个复数对象,并将其返回。 Complex Complex:add(double r) /复数和实数相加 return Complex(real + r, image); void Complex:output() if (image 0.0) cout“(“realimage“i)“endl; else cout“(“real“+“image“i)“endl; ,用函数实现对象的运算,相当于下列语句: Complex x; x.real=real+c.real; x.image=image+c.image; return x;,例6-1:实现复数的加法运算用成员函数,int main() Complex a(1.5, 2.8), b(-2.3, 3.4); Complex c1,c2; c1 = a.add(b); c2 = b.add(4.5); c1.output(); c2.output(); return 0; ,用函数实现对象的运算,(-0.8+6.2i) (2.2+3.4i),运行结果:,8,例6-2:实现复数的加法运算用友元函数,/若用非成员函数处理类对象的数据成员,只有一种方法,即将函数声明为友元函数。 #include using namespace std; class Complex protected: double real; /复数的实部 double image; /复数的虚部 public: Complex(double r = 0.0, double i = 0.0) real = r; image = i; void output(); friend Complex add(Complex c1,Complex c2); friend Complex add(Complex c,double r); friend Complex add(double r,Complex c); ;,用函数实现对象的运算,9,例6-2:实现复数的加法运算用非成员函数,void Complex:output() if (image 0.0) cout“(“realimage“i)“endl; else cout“(“real“+“image“i)“endl; / 利用友元函数完成类对象运算时,需将要计算的对象都作为参数传递 Complex add(Complex c1,Complex c2) return Complex(c1.real+c2.real, c1.image+c2.image); Complex add(Complex c,double r) return Complex(c.real+r, c.image); ,用函数实现对象的运算,10,例6-2:实现复数的加法运算用非成员函数,Complex add(double r,Complex c) return Complex(r+c.real, c.image); int main() Complex a(1.5, 2.8), b(-2.3, 3.4); Complex c1, c2, c3; c1 = add(a, b); c2 = add(a, 2.3); c3 = add(3.2, b); c1.output(); c2.output(); c3.output(); return 0; ,用函数实现对象的运算,(-0.8+6.2i) (3.8+2.8i) (0.9+3.4i),运行结果:,用函数实现对象的运算,12,6.2 运算符重载函数,C+语言除了函数重载之外,还允许程序员重新定义已有的运算符,使其能按用户的要求完成一些特定的操作,这就是所谓的运算符重载。例如,在C+系统内,对运算符+、-、*、/这四种运算符已有规定,他们是整数和实数的四则运算符。但如果需要对类对象作四则运算,那么就要对+、-、*、 重新进行定义。 运算符重载的实质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。,运算符重载函数,13,6.2 运算符重载函数,C+中可以重载的运算符 C+中不可重载的运算符,运算符重载函数,14,运算符重载规则,只能重载已有的运算符 重载之后运算符的优先级和结合性都不变 运算符重载是针对新类型数据的实际需要,对原有运算符进行适当的改造,一般来讲,重载的功能应当与原有功能类似,不能改变原运算符的操作对象个数,同时至少要有一个操作对象是自定义类型。 重载形式:一是运算符重载为类的成员函数;二是重载为类的友元函数。,运算符重载函数,15,1.运算符重载为成员函数,作为成员函数重载时,第一操作数就是当前对象本身,因此它并不需要出现在参数表中。 除了new 和delete以外,任何运算符都可以重载为成员函数,但不得重载为静态函数。=、 、( )、- 以及所有的类型转换运算符只能作为成员函数重载。 格式: 函数类型 operator 运算符(形参表) 函数体; ,运算符重载函数,16,例6-3:用“+”运算符实现复数的加法 重载为成员函数,#include using namespace std; class Complex protected: double real; /复数的实部 double image; /复数的虚部 public: Complex(double r = 0.0, double i = 0.0) real = r; image = i; void output(); /用于输出复数的函数 Complex operator +(Complex c); /实现复数与复数相加的函数 Complex operator +(double r); /实现复数与实数相加的函数 ;,运算符重载函数,17,例6-3:用“+”运算符实现复数的加法 重载为成员函数,void Complex:output() if (image 0.0) cout“(“realimage“i)“endl; else cout“(“real“+“image“i)“endl; /调用下述成员函数的对象即作为第一操作数,第二操作数由参数传递 Complex Complex:operator+(Complex c) return Complex(real+c.real, image+c.image); Complex Complex:operator+(double r) return Complex(real+r, image); ,运算符重载函数,18,例6-3:用“+”运算符实现复数的加法重载为成员函数,int main() Complex a(1.5, 2.8), b(-2.3, 3.4); Complex c1, c2; c1 = a + b; /a为第一操作数,b作为参数传递 / 此时发生函数调用,系统将其编译为a.operator +(b) c2 = a + 2.3; /编译为:a.operator+(2.3) c1.output(); c2.output(); return 0; ,运算符重载函数,(-0.8+6.2i) (3.8+2.8i),运行结果:,19,2. 运算符重载为友元函数,运算符也可以重载为类的友元函数,由于友元函数不是任何类的成员函数,因此重载时必须在参数表中显式地给出所有的操作数。 格式: friend 函数类型 operator 运算符(形参表) 函数体; ,运算符重载函数,20,例6-4:用“+”运算符实现复数的加法重载为友元函数,#include using namespace std; class Complex protected: double real; /复数的实部 double image; /复数的虚部 public: Complex(double r = 0.0, double i = 0.0) real = r; image = i; void output(); friend Complex operator+(Complex c1, Complex c2); friend Complex operator +(Complex c, double r); friend Complex operator +(double r, Complex c); ;,运算符重载函数,21,void Complex:output() if (image 0.0) cout“(“realimage“i)“endl; else cout“(“real“+“image“i)“endl; /类的友元函数不属于类,因此必须将要进行计算的类对象都作为参数传递 Complex operator +(Complex c1,Complex c2) return Complex(c1.real+c2.real, c1.image+c2.image); Complex operator +(Complex c, double r) return Complex(c.real + r, c.image); ,运算符重载函数,例6-4:用“+”运算符实现复数的加法重载为友元函数,22,Complex operator +(double r, Complex c) return Complex(r + c.real, c.image); int main() Complex a(1.5, 2.8), b(-2.3, 3.4); Complex c1, c2, c3; c1 = a + b; /调用a和b均为实参,编译为:c1=operaotr+(a,b); c2 = a + 2.3; / 即:c2=operator+(a,2.3); c3 = 3.4 + b; / 即:c2=operator+(3.4,b); c1.output(); c2.output(); c3.output(); return 0; ,运算符重载函数,(-0.8+6.2i) (3.8+2.8i) (1.1+3.4i),运行结果:,例6-4:用“+”运算符实现复数的加法重载为友元函数,23,练习,设计一个三角形类Triangle,包含三角形的三条边长的私有数据成员,另有一个重载运算符“+”,以实现求两个三角形对象的面积之和。 求三角形面积公式: p=(a+b+c)/2 s=sqrt(p*(p-a)*(p-b)*(p-c),24,练习,#include #include using namespace std; class Triangle int a,b,c; public: Triangle() Triangle(int x,int y,int z) a=x; b=y; c=z; float area() float p,s; p=(a+b+

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论