C++基础知识及MFC课件第5讲C++的多态性

上传人:E**** 文档编号:90581703 上传时间:2019-06-13 格式:PPT 页数:60 大小:350KB
返回 下载 相关 举报
C++基础知识及MFC课件第5讲C++的多态性_第1页
第1页 / 共60页
C++基础知识及MFC课件第5讲C++的多态性_第2页
第2页 / 共60页
C++基础知识及MFC课件第5讲C++的多态性_第3页
第3页 / 共60页
C++基础知识及MFC课件第5讲C++的多态性_第4页
第4页 / 共60页
C++基础知识及MFC课件第5讲C++的多态性_第5页
第5页 / 共60页
点击查看更多>>
资源描述

《C++基础知识及MFC课件第5讲C++的多态性》由会员分享,可在线阅读,更多相关《C++基础知识及MFC课件第5讲C++的多态性(60页珍藏版)》请在金锄头文库上搜索。

1、1,第5讲 C+的多态性,2,本讲主要内容,1. 运算符重载 2. 虚函数,3,多态性是面向对象程序的重要特征之一。简单来说,多态性就是指“一个接口,多种方法”。在C+语言中,多态性可以通过函数重载、运算符重载及虚函数来实现。 函数重载的概念在前面已经介绍过,如普通函数的重载、类的构造函数的重载等。下面开始介绍运算符的重载。,4,4.1 运算符重载,C+语言中定义了多种运算符,如“+、-、*、/、=、”等,这些运算符可以实现基本数据类型的运算。对于自定义的数据类型,如类对象,如果想通过运算符直接进行运算,就必须对相关的运算符进行重载。 运算符的重载是通过创建运算符重载函数来实现的。 运算符的重

2、载有三种方式:作为类的成员函数、作为类的友元函数、作为类外定义的普通函数。,5,4.1.1 通过成员函数实现运算符的重载,【例4-1】 通过运算符重载实现日期类对象的比较。本例以成员函数的方式进行运算符“”的重载。,6,#include using namespace std; class CDate int m_nYear; int m_nMonth; int m_nDay; public: CDate(int nYear, int nMonth, int nDay); int GetYear(); int GetMonth(); int GetDay(); bool operator(CD

3、ate date); ;,比较运算符”的重载,关键字operator,函数名是: operator,7,CDate:CDate(int nYear, int nMonth, int nDay) m_nYear = nYear; m_nMonth = nMonth; m_nDay = nDay; int CDate:GetYear() return m_nYear; int CDate:GetMonth() return m_nMonth; int CDate:GetDay() return m_nDay; ,8,bool CDate:operatorm_nYear m_nYear = date

4、.m_nYear) ,运算符函数的隐式调用。也可以写成: if(date1.operator(date2) /显式调用,date1是左操作数, date2是右操作数,9,说明,(1)在类的内部,定义成员运算符重载函数的语法形式为: 函数返回值类型 operator运算符(形参表) 函数体 ,10,说明,(2)如果在类的外部定义成员运算符重载函数,则需要先在类的内部进行声明,然后在类外进行定义。其形式如下: class 类名 函数返回值 operator运算符(形参表); ; 函数返回值 类名:operator运算符(形参表) 函数体 ,11,4.1.2 通过友元函数实现运算符重载,上面介绍的成

5、员运算符重载函数能够实现两个类对象的运算。 但是,对于左操作数是基本数据类型,而右操作数是类对象的情况,通常通过成员运算符函数就不能实现重载运算了,例如,将某一字符串常量“1992.12.18”与某一日期类对象进行比较。其原因在于:这时左操作数不是类对象,不能调用类的成员函数。在这种情况下,需要通过友元函数来实现运算符的重载。,12,【例4-2】 通过友元运算符重载函数实现字符串常量与日期类对象的比较,13,#include #include class CDate int m_nYear; int m_nMonth; int m_nDay; public: CDate(int nYear,

6、int nMonth, int nDay); int GetYear(); int GetMonth(); int GetDay(); bool operator(CDate date); friend bool operator(const char* strDate, CDate ,通过友元函数进行比较运算符“的重载,这里做了修改(针对VC 6.0编译环境),14, bool operator(const char* strDate, CDate ,15,int main() CDate date1(1992, 3, 5), date2(1993, 4, 8); if(date1 date

7、2) cout“date1的日期早于date2“endl; else cout“date1的日期不早于date2“; CDate date3(1992, 12, 29); if(“1992.12.19“ date3) cout“date3的日期值晚于:1992.12.19“endl; else cout“date3的日期值不晚于:1992.12.19“endl; return 0; ,调用成员运算符重载函数: bool operator(CDate date);,调用友元运算符重载函数: bool operator(const char* strDate, CDate ,16,注意,有的C+编

8、译系统(如Visual C+6.0),没有完全实现C+标准,对友元运算符重载函数支持的不好,当使用命名空间和不带后缀“.h”的iostream文件时,可能会出现与友元运算符重载函数有关的编译错误。 本程序为了消除VC6.0中的这种问题,将上例中的语句 #include using namespace std; 修改成了: #include #include 这时程序在Visual C+6.0编译环境下可以正常编译。,17,说明,(1)通过友元函数进行运算符重载,可以使基本数据类型出现在运算符的左边,而类对象出现在运算符的右边。 (2)对于双目运算符而言,成员运算符重载函数的参数表中只有一个参数

9、,而友元运算符重载函数的参数表中有两个参数;对于单目运算符而言,成员运算符重载函数的参数表中通常没有参数,而友元运算符重载函数的参数表中有一个参数。,18,4.1.3 通过类外的普通函数 实现运算符的重载,【例4-3】 通过运算符重载实现复数的相加。,19,#include using namespace std; class CComplex public: double m_real; double m_imag; CComplex(double real = 0.0, double imag = 0.0) m_real = real; m_imag = imag; ;,20,CCompl

10、ex operator+(const CComplex ,21,int main() CComplex complex1(1.2, 2.4), complex2(3.3, 4.4), complex3, complex4; complex3 = complex1 + complex2; cout“complex3.m_real=“complex3.m_real“ “complex3.m_imag=“complex3.m_imagendl; complex4 = operator+(complex1, complex2); cout“complex4.m_real=“complex4.m_rea

11、l“ “complex4.m_imag=“complex4.m_imagendl; return 0; ,运算符重载函数的隐式调用,运算符重载函数的显式调用,22,4.1.4 “+”和“-”运算符的重载,自增运算符“+”和自减运算符“-”运算符属于单目运算符。这两种运算符都有前缀和后缀两种形式,其作用是不同的。 下面先给出使用成员函数重载前缀“+”运算符和后缀“+”运算符的例子。然后给出使用友元函数重载前缀“+”运算符和后缀“+”运算符的例子。,23,【例4-4】 通过成员函数实现前缀自增运算符和后缀自增运算符的重载,24,#include using namespace std; class

12、 CPoint public: int m_x; int m_y; CPoint(int x = 0, int y = 0); CPoint operator+(); /前缀形式 CPoint operator+(int i); /后缀形式 ;,“+”前缀运算符的重载,“+”后缀运算符的重载,带1个没有被使用的整型参数,25,CPoint:CPoint(int x, int y) m_x = x; m_y = y; CPoint CPoint:operator+() +m_x; +m_y; return *this; CPoint CPoint:operator+(int i) CPoint

13、temp(*this); m_x+; m_y+; return temp; ,改成: m_x+; m_y+; 对本函数来说是否是等价的?,先赋值,再自增,26,int main() CPoint point1(100, 100), point2; cout“point1的初值为:“x=“point1.m_x“ “y=“point1.m_yendl; +point1; /前缀自增 cout“point1的值为:“x=“point1.m_x“ “y=“point1.m_yendl; point2 = point1+; /后缀自增 cout“point2的值为:“x=“point2.m_x“ “y=

14、“point2.m_yendl; cout“point1的值为:“x=“point1.m_x“ “y=“point1.m_yendl; coutendl; point1.operator+(); /前缀自增 cout“point1的值为:“x=“point1.m_x“ “y=“point1.m_yendl; point2 = point1.operator+(0); /后缀自增 cout“point2的值为:“x=“point2.m_x“ “y=“point2.m_yendl; cout“point1的值为:“x=“point1.m_x“ “y=“point1.m_yendl; return

15、0; ,程序运行结果: point1的初值为:x=100 y=100 point1的值为:x=101 y=101 point2的值为:x=101 y=101 point1的值为:x=102 y=102 point1的值为:x=103 y=103 point2的值为:x=103 y=103 point1的值为:x=104 y=104,27,说明,前缀自增成员函数的声明为: CPoint operator+(); 该函数不带参数,将当前对象作为前缀自增运算符“+”的操作数进行运算。 后缀自增成员函数的声明为: CPoint operator+(int i); 该函数带了一个整型参数“int i”,

16、其实,该参数并没有被实际使用。该参数设立的目的是与前缀自增成员函数有所区别:当C+编译系统遇到后缀自增运算符时,会自动调用该带整型参数的函数,当遇到前缀自增运算符时,自动调用不带参数的前缀自增成员函数。,28,【例4-5】 通过友元函数重载前缀自增运算符和后缀自增运算符,#include using namespace std; class CPoint public: int m_x; int m_y; CPoint(int x = 0, int y = 0); friend CPoint operator+(CPoint ,29,CPoint:CPoint(int x, int y) m_x = x; m_y = y; CPoint operator+(CPoint ,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号