C++基础知识及MFC课件第6讲模板

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

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

1、第6讲 模板,2,本讲主要内容,1. 函数模板 2. 类模板,3,模板(template)的目的是实现类型的参数化,即将类型作为参数,这样,同样一段代码,可以处理不同类型的参数。 模板提供了将代码与数据类型相脱离的机制。 模板可分为函数模板和类模板两种类型,在定义函数或类的成员时,可以将数据类型作为模板的参数。模板适用于函数或类的功能相同,而函数参数或类成员所涉及的数据类型不同的场合。与函数和类相比,模板进一步实现了代码的重用。,4,5.1 函数模板,函数模板是指建立一个通用函数,该函数的某些形参类型或函数返回类型不具体指定,使用类型参数标识符代替。在调用函数模板时,会根据实参的类型来取代函数

2、模板中的类型参数标识符,从而生成实际的函数。,5,【例5-1】 函数模板的使用,本例的功能是比较员工对象的不同属性值的大小。为了更好地实现代码重用,在本例中,定义了用于数据比较的函数模板,其功能是实现两个操作数的“”比较。 在该函数模板中,将操作数的类型作为函数参数,这样,同样的一段代码,在本例中既可以实现长整数的比较、又可以实现双精度数的比较,还可以实现日期类对象的比较。,6,#include using namespace std; class CDate int m_nYear; int m_nMonth; int m_nDay; public: CDate(int nYear, int

3、 nMonth, int nDay); int GetYear(); int GetMonth(); int GetDay(); bool operator(CDate date); ; ,日期类,7,class CPerson protected: char* m_strName; char* m_strID; char m_cSex; CDate m_Birthday; public: CPerson(char* strName = “, char* strID = “, char cSex = 0, int nYear =0, int nMonth = 0, int nDay = 0);

4、 CPerson(); void SetBirthday(CDate Birthday); CDate GetBirthday() const; virtual void PrintInfo() = 0; ; ,人员类,8,class CEmployee: public CPerson static unsigned long m_nCount; private: double m_fSalary; public: CEmployee(char* strName = “, char* strID = “, char cSex = 0, int nYear = 0, int nMonth = 0

5、, int nDay = 0, double fSalary = 0.0); CEmployee(); void SetSalary(double fSalary); void GetSalary(double ,员工类,9,template bool Compare(T a, T b) if (a b) return true; else return false; ,也可以写成: template ,实现两个操作数比较的函数模板,10,unsigned long CEmployee:m_nCount = 0; int main() CEmployee EmployeeArray3 = CE

6、mployee(“张山“, “10200820902“, 0, 1982, 1, 1, 3166.0), CEmployee(“李慧“, “10200820901“, 1, 1981, 3, 8, 3365.0), CEmployee(“杨武“, “10200820998“, 0, 1976, 12, 16, 3866.0);,11,_int64 nID1, nID2; char strID112, strID212; CDate Birthday(0, 0, 0); double dSalary1, dSalary2; int nMinIDIndex, nMinBirthdayIndex,

7、nMinSalaryIndex; EmployeeArray0.GetID(strID1); nID1 = _atoi64(strID1); nMinIDIndex = 0; for(int i = 1; i3; i+) EmployeeArrayi.GetID(strID2); nID2 = _atoi64(strID2); if(!Compare(nID1, nID2) nID1 = nID2; nMinIDIndex = i; cout“编码最小的员工的信息为:n“; EmployeeArraynMinIDIndex.PrintInfo();,找出一个编号最小的员工,进行员工属性值的比较

8、(包括员工编号、出生日期和工资),类型参数T被替换为_int64,64bit的整数类型,将字符串转换为64bit整数,12,Birthday = EmployeeArray0.GetBirthday(); nMinBirthdayIndex = 0; for(i = 1; i3; i+) if(!Compare(Birthday, EmployeeArrayi.GetBirthday() Birthday = EmployeeArrayi.GetBirthday(); nMinBirthdayIndex = i; cout“出生日期最早的员工的信息为:n“; EmployeeArraynMin

9、BirthdayIndex.PrintInfo();,找出一个出生日期最早的员工,输出其信息,类型参数T被替换为CDate,13,EmployeeArray0.GetSalary(dSalary1); nMinSalaryIndex = 0; for(i = 1; i3; i+) EmployeeArrayi.GetSalary(dSalary2); if(!Compare(dSalary1, dSalary2) dSalary1 = dSalary2; nMinSalaryIndex = i; cout“工资最低的员工的信息为:n“; EmployeeArraynMinSalaryIndex

10、.PrintInfo(); return 0; ,找出一个工资最低的员工,输出其信息,类型参数T被替换为double,程序的运行结果如下: 编码最小的员工的信息为: 姓名:李慧 编号:50200800901 性别:女 出生日期:1981,3,8 工资:3365 出生日期最早的员工的信息为: 姓名:杨武 编号:50200800998 性别:男 出生日期:1976,12,16 工资:3866 工资最低的员工的信息为: 姓名:张山 编号:50200800902 性别:男 出生日期:1982,1,1 工资:3166,14,本例中定义的函数模板如下: template /也可以写成: template

11、bool Compare(T a, T b) if (a b) return true; else return false; 模板的定义以关键字template开头,关键字class(或typename)表 示后面的标识符(这里是T)是模板参数(数据类型参数)。 本函数模板中,变量a和b的数据类型在定义函数模板时并没有确定。 它们是在函数模板被调用时确定的。例如,下面的3条语句: if(!Compare(nID1, nID2) if(!Compare(Birthday, EmployeeArrayi.GetBirthday() if(!Compare(dSalary1, dSalary2)

12、分别将模板参数T的类型替换为_int64、CDate和double。,15,说明,(1)这些在调用函数模板时生成的函数模板实例称为模板函数,此实例化的过程称为函数模板的实例化。,16,说明,(2)函数模板在实例化时,编译器根据实际参数的数据类型进行函数模板类型参数的替换,生成一个真正的函数,然后再对该函数进行编译。 (3)在template语句和函数模板定义语句之间不能有别的语句。例如:下面的代码就会出现编译错误。 template int j; T min(T x, T y) return (xy) ? x : y ; ,错误:不允许在template语句和函数模板定义语句之间插入别的语句,

13、17,说明,(4)定义函数模板时可以使用多个类型参数,其形式如下所示。 template 或 template ,18,【例5-2】 使用多个类型参数的函数模板,19,#include using namespace std; template void fun(T1 x, T2 y) coutx“ “yendl; int main() int j = 200; char str120 = “Hello“; double d = 123.45; char c = a; fun(j, str1); fun(d, c); return 0; ,程序的运行结果如下: 200 Hello 123.45

14、 a,类型参数T1和T2被分别替换成了int和char*,类型参数T1和T2被分别替换成了double和char,20,5.2 类模板,类模板(class template)是这样一种通用类:在定义类时不指明某些数据成员、成员函数的参数及返回值的数据类型,而是用类型参数取代。 类模板也称为参数化的类,它可以生成多个成员和功能相似的类,这些类的区别仅仅是某些数据成员、成员函数的参数或返回值的数据类型不同。,21,【例5-3】 通过类模板建立学生链表和 员工链表,在本例中,将链表结点定义为类模板,该链表结点所包含的数据的类型被作为类模板的类型参数。,22,#include using namesp

15、ace 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(); ; ,日期类,23,class CPerson protected: char* m_strName; char* m_strID; char m_cSex; CDate m_Birthday; public: CPerson(char* strName = “, char* strID = “, char cSex = 0, int nYear =0, int nMonth = 0, int nDay = 0); CPerson(); void SetBirthday(CDate Birthday); CDate GetBirthday() const; virtual void PrintInfo() = 0; ; ,人员类,24,class CStudent: public CPerson static unsigned long m_nCount; private: char *m_strMajor; public: CStude

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

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

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