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