C程序设计课件(第3章).ppt
《C程序设计课件(第3章).ppt》由会员分享,可在线阅读,更多相关《C程序设计课件(第3章).ppt(72页珍藏版)》请在三一文库上搜索。
1、1,第3章多态性,本章学习重点掌握内容: 多态的概念和作用,多态的实现方法 常见运算符的重载 静态联编和动态联编 虚函数、纯虚函数和抽象基类的概念和用法 虚析构函数的概念和作用,虚析构函数的用法,2,3.1多态性的概念,多态性(Polymorphism)是面向对象程序设计的重要特性之一。多态性是指当不同的对象收到相同的消息时,产生不同的动作。利用多态性可以设计和实现一个易于扩展的系统。 多态性主要体现在:向不同的对象发送同一个消息,不同的对象在接收时会产生不同的行为。也就是说,每个对象可以用自己的方式去响应共同的消息。C+支持两种形式的多态性,一种是编译时的多态性,称为静态联编。一种是运行时多
2、态,称为动态联编。,3,3.2.1 运算符重载,3.2.1 运算符重载概述 在以前的学习中,C+中预定义的运算符的操作对象只能是基本数据类型如int或float等。实际上,对于很多用户自定义的类型(如类),也需要有类似的运算操作。 例如复数类Complex。 class Complex public: Complex () real=image=0; Complex (double r, double i),4,3.2.1 运算符重载概述, real = r, image = i; void Print(); private: double real, image; ; void Comple
3、x:Print() if(image0) coutrealimagei; else coutreal+imagei; ,5,3.2.1 运算符重载概述,声明复数类的对象:complex c1(2.0, 3.0), c2(4.0, -2.0), c3。如果我们需要对c1和c2进行加法运算, “c3=c1+c2”,编译时却会出错,这是因为编译器不知道该如何完成这个加法。这时我们就需要编写程序来实现“+”运算符来作用于complex类的对象,这就是运算符的重载。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,导致不同类型的行为。,6,3.2.1 运算符重载概述,C+中运
4、算符的重载虽然给我们设计程序带来很多的方便,但对运算符的重载时,以下的几种情况需要注意: (1)一般来说,不改变运算符原有含义,只让它能针对新类型数据的实际需要,对原有运算符进行适当的改造。例如,重载“+”运算符后,它的功能还是进行加法运算。 (2)重载运算符时,不能改变运算符原有的优先级别,也不能改变运算符需要的操作数的数目。重载之后运算符的优先级和结合性都不会改变。,7,3.2.1 运算符重载概述,(3)不能创建新的运算符,只能重载c+中已有的运算符。 (4)有些运算符不能进行重载。如:“.”类成员运算符、“*”类指向运算符、“:”类作用域运算符、“?:”条件运算符及“sizeof”求字节
5、数运算符。,8,3.2.2 运算符重载的实现,运算符重载的本质就是函数重载。在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中完成的。运算符重载形式有两种:重载为类的成员函数和重载为类的友元函数。 1. 运算符重载为类的成员函数 语法形式如下: 函数类型 operator 运算符(形参表) 函数体;,9,3.2.2 运算符重载的实现,2. 运算符重载为类的友元函数 运算符重载还可以为友元函数。当重载友元函数时,将没有隐含的参数this指针。语法形式如下: friend 函数类型 opera
6、tor 运算符(形参表); 运算符重载为友元函数时,要在函数类型说明之前使用friend关键词来说明。,10,3.2.3 双目运算符重载,双目运算符就是运算符作用于两个操作数。下面通过一个例子对“+”运算符重载来学习一下双目运算符重载的应用。 【例3.1】定义一个复数类,重载“+”运算符为复数类的成员函数,使这个运算符能直接完成两个复数的加法运算,以及一个复数与一个实数的加法运算。,11,#include class Complex public: Complex () real=image=0; Complex (double r, double i) real = r, image = i
7、; void Print(); Complex operator + (Complex ,C/C+程序设计教程-面向对象分册,void Complex:Print() if(image0) coutrealimageiendl; else coutreal+imageiendl; Complex Complex:operator + (Complex ,13,Complex Complex:operator + (float s) Complex t; t.real=real+s; t.image=image; return t; ,14,void main(void) Complex c1(
8、25,50),c2(100,200),c3; coutc1=; c1.Print(); coutc2=; c2.Print(); c3=c1+c2; coutc3=c1+c2=; c3.Print(); c1 = c1 + 200; coutc1=; c1.Print(); ,15,【例3.2】重载“+”运算符为复数类的友元函数,使这个运算符能直接完成两个复数的加法运算,以及一个复数与一个实数的加法运算。 class Complex public: Complex (double r, double i); friend Complex operator +(const Complex ,16
9、,Complex operator +(const Complex ,17,void main() Complex c1(2.0, 3.0), c2(4.0, -2.0), c3(0,0); c3 = c1 + c2; cout“c1+c2=“; Print(c3); c3 = c1 + 5; cout“c1+5=“; Print(c3); ,18,【例3.3】日期类date中采用友元形式重载“+”运算符,实现日期加上一个天数,得到新日期。 static int mon_day = 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 ; class C
10、Date public: CDate (int m=0,int d=0,int y=0); void Display() ; friend CDate operator + (int d, CDate dt); /友元形式重载“+“运算符 private: int month, day, year; ;,19,CDate operator + (int d, CDate dt) dt.day = dt.day + d; while(dt.day mon_daydt.month-1) / 少一个闰年判断 dt.day = dt.day- mon_daydt.month-1; dt.month+;
11、 if(dt.month= =13) dt.month=1; dt.year+; return dt; ,20,3.2.4 赋值运算符重载,在C+中有两种类型的赋值运算符:一类是“+=”和“-=”等先计算后赋值的运算符,另一类是“=”即直接赋值的运算符。下面分别进行讨论。 1运算符“+=”和“- =”的重载 【例3.4】 实现复数类“+=”和“-=”的重载。 #include class Complex public:,21,Complex(double r,double i) real=r;image=i; Complex operator -=(Complex ,22,Complex:Pr
12、int() if(image0) coutrealimageiendl; else coutreal+imageiendl; void main() Complex c1(5.0,3.0),c2(2.1,1.8),c3(5.3,4.2); c1-=c2; coutc1=; c1.Print(); c3+=c2; coutc3=;c3.Print(); ,23,3.2.4 赋值运算符重载,2运算符“=”的重载 【例3.5】 实现“=”运算符重载的示例。 #include #include class CMessage public: CMessage( ) buffer = NULL; CMes
13、sage() delete buffer; ,24,void Display( ) coutbufferendl; void Set(char *string) if(buffer != NULL) delete buffer; buffer= new charstrlen(string)+1; strcpy(buffer, string); void operator=(const CMessage ,25,private: char *buffer; ; void main( ) CMessage c1; c1.Set(“initial c1 message“); c1.Display(
14、); CMessage c2; c2.Set(“initial c2 message“); c2.Display( ); c1=c2; c1.Display( ); ,26,3.2.5 单目运算符重载,类的单目运算符可重载为一个没有参数的非静态成员函数或者带有一个参数的非成员函数,参数必须是用户自定义类型的对象或者是对该对象的引用。 在C+中,单目运算符有+和-,它们是变量自动增1和自动减1的运算符。在类中可以对这两个单目运算符进行重载。,27,3.2.5 单目运算符重载,如同“+”运算符有前缀、后缀两种使用形式,“+”和“-”重载运算符也有前缀和后缀两种运算符重载形式,以“+”重载运算符为例
15、,其语法格式如下: 函数类型 operator +(); /前缀运算 函数类型 operator +(int);/后缀运算 使用前缀运算符的语法格式如下: +对象; 使用后缀运算符的语法格式如下: 对象+;,28,【例3.6】重载单目运算符“+”。 #include class Counter public: Counter()v=0; Counter operator +(); /前置单目运算符 Counter operator +(int); /后置单目运算符 void Display() coutvendl; private: int v; ;,29,Counter Counter:op
16、erator +() /前置单目运算 +v; return *this; Counter Counter:operator +(int) /后置单目运算 Counter t; t.v=v+1; return t; ,30,void main() Counter c1, c2; int i; for(i=0;i4;i+) /后置单目运算符 c1+; coutc1=; c1.Display(); for(i=0;i4;i+) /前置单目运算符 +c2; coutc2=; c2.Display(); ,31,3.2.6 下标运算符重载,下标运算符“ ”通常用于在数组中标识数组元素的位置,下标运算符重
17、载可以实现数组数据的赋值和取值。下标运算符重载函数只能作为类的成员函数,不能作为类的友元函数。 下标运算符“ ”函数重载的一般形式为: 函数类型 operator (形参表); 其中形参表为该重载函数的参数列表。重载下标运算符只能且必须带一个参数,该参数给出下标的值。,32,【例3.7】定义一个字符数组类,其中对下标运算符“ ”进行重载。 #include #include class MyCharArray public: MyCharArray(int m) len=m; str=new charlen; MyCharArray(char *s) str=new charstrlen(s)
18、+1; strcpy(str,s); len=strlen(s); ,33,MyCharArray() delete str; char ,34,void Disp() coutstrendl; private: int len; char *str; ; void main() MyCharArray word(“This is a C+ program.“); word.Disp(); cout“位置0:“; coutword0endl;,35,cout“位置15:“; coutword15endl; cout“位置25:“; coutword25endl; word0=t; word.D
19、isp(); int f=10; MyCharArray word2(f); for(int i=0;i10;i+) word2i=wordi; word2.Disp(); ,36,3.2.7 关系运算符重载,关系运算符也可以被重载,例如定义一个日期类date,重载运算符“= =”和“ class Date public: Date(int m,int d,int y) month=m; day=d; year=y; ,37,void Display() cout t2返回0,否则返回1 if(t1.yeart2.year) return 1; else if(t1.montht2.month
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 课件
链接地址:https://www.31doc.com/p-3479319.html