C程序设计-对象分册(第3章).ppt
《C程序设计-对象分册(第3章).ppt》由会员分享,可在线阅读,更多相关《C程序设计-对象分册(第3章).ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1第第3章多态性章多态性n本章学习重点掌握内容:本章学习重点掌握内容:n多态的概念和作用,多态的实现方法多态的概念和作用,多态的实现方法n常见运算符的重载常见运算符的重载n静态联编和动态联编静态联编和动态联编n虚函数、纯虚函数和抽象基类的概念和用法虚函数、纯虚函数和抽象基类的概念和用法n虚析构函数的概念和作用,虚析构函数的用法虚析构函数的概念和作用,虚析构函数的用法2第第3章多态性章多态性n3.1多态性的概念多态性的概念 n3.2 运算符重载运算符重载n3.3联编和虚函数联编和虚函数 n3.4 纯虚函数和抽象类纯虚函数和抽象类n3.5 综合应用实例综合应用实例33.1多态性的概念多态性的概念n
2、多态性就是多态性就是一个事物多种形态一个事物多种形态,就是同一符号,就是同一符号或者名字在不同情况下具有不同解释的现象。或者名字在不同情况下具有不同解释的现象。n多态性有两种表现形式:多态性有两种表现形式:n一种是一种是不同的对象在收到相同的消息时,产生不同不同的对象在收到相同的消息时,产生不同的动作;的动作;n另一种是另一种是同一对象收到相同的消息却产生不同的函同一对象收到相同的消息却产生不同的函数调用。数调用。4多态的两种实现方式多态的两种实现方式n两种表现形式分别叫做:两种表现形式分别叫做:编译时多态和运行时编译时多态和运行时多态。多态。n编译时多态编译时多态也叫静态多态性,属于早期绑定
3、,也叫静态多态性,属于早期绑定,在编译时就实现了绑定,它是在编译时就实现了绑定,它是静态联编静态联编的;的;n实现实现 方式方式重载,包括函数重载。操作符重载重载,包括函数重载。操作符重载n运行时多态运行时多态也叫动态多态性,属于晚期绑定,也叫动态多态性,属于晚期绑定,在编译时还无法确定绑定对象,只有在运行时才能在编译时还无法确定绑定对象,只有在运行时才能够实现绑定,它是够实现绑定,它是动态联编动态联编的。实现方式:的。实现方式:虚函数虚函数53.2.1 运算符重载概述运算符重载概述复数类Complexclass Complexpublic:Complex()real=image=0;Comp
4、lex(double r,double i)real=r,image=i;void Print();private:double real,image;void Complex:Print()if(image0)coutreal-imagei;else coutreal+imagei;63.2.1 运算符重载概述运算符重载概述complex c1(2.0,3.0),c2(4.0,-2.0),c3;c3=c1+c2;编写程序来实现“+”运算符来作用于complex类的对象,这就是运算符的重载。运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时,导致不同类型的行为。73.
5、2.1 3.2.1 运算符重载概述运算符重载概述(1)一般来说,不改变运算符原有含义,只让它能针对新类型数据的实际需要,对原有运算符进行适当的改造。例如,重载“+”运算符后,它的功能还是进行加法运算。(2)重载运算符时,不能改变运算符原有的优先级别,也不能改变运算符需要的操作数的数目。重载之后运算符的优先级和结合性都不会改变。(3)不能创建新的运算符,只能重载c+中已有的运算符。(4)有些运算符不能进行重载。如:“.”类成员运算符、“*”类指向运算符、“:”类作用域运算符、“?:”条件运算符及“sizeof”求字节数运算符。83.2.2 运算符重载的实现运算符重载的实现n运算符重载的本质就是函
6、数重载。属于属于静态多静态多态性态性 首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参,然后根据实参的类型来确定需要调用的函数.这个过程是在编译过程中完成的。n运算符重载形式有两种:类的成员函数、友元函数。9语法形式如下:函数类型 operator 运算符(形参表)函数体;n重载重载一元运算符没有参数一元运算符没有参数;重载二元运算符只有一个参数。;重载二元运算符只有一个参数。n一般基于某个对象调用成员函数,这个对象是一个一般基于某个对象调用成员函数,这个对象是一个隐含的操作数隐含的操作数,就是被调用的运算符函数的一个操作数,而且是第一操作数就是被调用的运算符函数
7、的一个操作数,而且是第一操作数n有了运算符重载以后,当程序中出现表达式:有了运算符重载以后,当程序中出现表达式:oCCounter2=oCCounter2+oCCounter1;的时候编译程序将其解释为:的时候编译程序将其解释为:oCCounter2=oCCounter2.operator+(oCCounter1)n成员函数的调用只能够通过成员函数所属的类的对象来调用,也成员函数的调用只能够通过成员函数所属的类的对象来调用,也就是说被重载的运算符的第一操作数的类型是确定的,是隐含的,就是说被重载的运算符的第一操作数的类型是确定的,是隐含的,不可改变。不可改变。运算符重载为类的成员函数10运算符
8、重载为类的友元函数语法形式如下:friend 函数类型 operator 运算符(形参表)函数体;n不是成员函数,也没有不是成员函数,也没有this指针,指针,用友元函数用友元函数重载二元运算符(双目运算符)时,要有两个重载二元运算符(双目运算符)时,要有两个参数;重载一元运算符(单目运算符)时,要参数;重载一元运算符(单目运算符)时,要有一个参数。有一个参数。11成员函数与友元函数重载区别成员函数与友元函数重载区别n当运算符重载为类的成员函数时,函数的参数当运算符重载为类的成员函数时,函数的参数个数比原来的参与运算的运算数个数要个数比原来的参与运算的运算数个数要少一个少一个(后缀(后缀+、-
9、除外除外).n当运算符重载为类的友元函数时,参数个数与当运算符重载为类的友元函数时,参数个数与原运算数的个数相同。原运算数的个数相同。12单目和双目运算符重载的重载单目和双目运算符重载的重载n一般来讲,一般来讲,单目运算符最好重载为成员函数,单目运算符最好重载为成员函数,而双目运算符则最好重载为友元函数。而双目运算符则最好重载为友元函数。n1 单目运算符重载单目运算符重载n可重载为没有参数的成员函数或者带有一个参数的可重载为没有参数的成员函数或者带有一个参数的非成员函数(友元函数),非成员函数(友元函数),其参数必须是用户定义其参数必须是用户定义类型的对象或者是对该对象的引用类型的对象或者是对
10、该对象的引用13单目运算符重载单目运算符重载n单目运算符单目运算符+和和-,重载时,由于有前缀和,重载时,由于有前缀和后缀的差别,其参数个数遵照以下格式规定后缀的差别,其参数个数遵照以下格式规定:n operator+();/前缀运算符重载前缀运算符重载 n operator+(int);/后缀运算符重载后缀运算符重载n operator-();/前缀运算符重载前缀运算符重载 n operator-(int);/后缀运算符重载后缀运算符重载前缀和后缀重载的区分前缀和后缀重载的区分.14双目运算符重载双目运算符重载n可以重载为带一个参数的成员函数或者带两个参数的可以重载为带一个参数的成员函数或者
11、带两个参数的友元函数。友元函数。n问题:问题:n CCounter operator+(CCounter ob);n“oCCounter2=oCCounter1+20;”/正确正确n“oCCounter2=20+oCCounter1;”/错误错误n解决解决n使用友元重载使用友元重载nfriend CCounter operator+(CCounter ob,int);nfriend CCounter operator+(int,CCounter ob);153.2.3 双目运算符重载双目运算符重载【例例3.1】定义一个复数类,重载定义一个复数类,重载“+”运算符为复数类的成员函数,使运算符为复
12、数类的成员函数,使这个运算符能直接完成两个复数的加法运算,以及一个复数与一个实数的这个运算符能直接完成两个复数的加法运算,以及一个复数与一个实数的加法运算。加法运算。【例例3.2】重载重载“+”运算符为复数类的友元函数,使这个运算符能直接运算符为复数类的友元函数,使这个运算符能直接完成两个复数的加法运算,以及一个复数与一个实数的加法运算。完成两个复数的加法运算,以及一个复数与一个实数的加法运算。【例例3.3】日期类日期类date中采用友元形式重载中采用友元形式重载“+”运算符,实现日期加上一个天数,运算符,实现日期加上一个天数,得到新日期。得到新日期。【例3.6】重载单目运算符“+”。163.
13、2.4 赋值运算符重载赋值运算符重载在C+中有两种类型的赋值运算符:一类是“+=”和“-=”等先计算后赋值的运算符,另一类是“=”即直接赋值的运算符。1运算符“+=”和“-=”的重载【例3.4】实现复数类“+=”和“-=”的重载。173.2.4 赋值运算符重载赋值运算符重载n正常情况下,系统会为每一个类正常情况下,系统会为每一个类自动生成自动生成一个默认的一个默认的完成上述功能的赋值运算符。这个赋值运算符完成的完成上述功能的赋值运算符。这个赋值运算符完成的是是“复制赋值复制赋值”的功能。的功能。n但这种但这种“复制赋值复制赋值”是一种是一种“浅复制浅复制”,即它将对象,即它将对象数据成员数据成
14、员“逐位逐位”(bit)进行复制赋值。)进行复制赋值。(拷贝构造(拷贝构造函数)函数)n成员变量包含指针时,是非常危险的,所以需要重载成员变量包含指针时,是非常危险的,所以需要重载赋值运算。同样也需要重载拷贝构造函数。赋值运算。同样也需要重载拷贝构造函数。n想想结构(想想结构(struct)的赋值)的赋值n注意:注意:赋值运算赋值运算系统自动生成,其他操作则不自动生系统自动生成,其他操作则不自动生成成n例例3.5183.2.6 下标运算符重载下标运算符重载 下标运算符“”通常用于在数组中标识数组元素的位置,下标运算符重载可以实现数组数据的赋值和取值。下标运算符重载函数只能作为类的成员函数,不能
15、作为类的友元函数。下标运算符“”函数重载的一般形式为:函数类型 operator(形参表);其中形参表为该重载函数的参数列表。重载下标运算符只能且必须带一个参数,该参数给出下标的值。注意下标操作符需要出现在赋值操作符的左右两边,为了能在左边出现,返回值必须是引用。以字符类为例说明。193.2.7 关系运算符重载关系运算符也可以被重载,例如定义一个关系运算符也可以被重载,例如定义一个日期类日期类date,重载运算符,重载运算符“=”和和“”,用于两个日期的等于和小于的比较运算。,用于两个日期的等于和小于的比较运算。203.2.8 类型转换运算符重载类型转换运算符重载 类型转换函是一种特殊类型的类
16、成员函数 它定义了一个由用户定义的转换 以便把一个类对象转换成某种其他的类型 类型转换运算符重载函数的格式如下:operator 类型名()函数体 类型转换运算符重载函数没有返回类型,因为类型名就代表了它的返回类型,而且也没有任何参数。在调用过程中要带一个对象实参。可以同时定义多个类型转换函数,即类转换成多种类型 例子实现复数类转换成double型和字符类转换成字符指针的例子 213.3 联编和虚函数联编和虚函数 3.3.1 静态联编和动态联编面向对象的多态性从实现的角度来讲,可以分为静态多态性和动态多态性两种。在源程序编译的时候就能确定具有多态性的语句调用哪个函数,称为静态联编。对于重载函数
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序设计 对象 分册
限制150内