C++实用教程[郑阿奇主编]15.ppt
文本预览下载声明
第15章 模 板 15.1 函数模板 15.1.1 函数模板定义 函数模板的定义包括两部分:一是模板(类型参数)声明部分,二是函数自身声明或定义部分。其中: (1)template是C++关键字,表示声明的是模板。 (2)由一对“ ”尖括号构成的是该模板的类型参数表,其中可以有一个或多个类型参数,但多个类型参数之间需用逗号“,”分隔。 (3)每个类型参数可以由C++关键字class和类型名组成,或由一般具体类型和类型名组成,其中类型名一定要符合C++命名规则。 说明 (1)在类型参数声明中,由于class是类声明关键字,为了避免混淆,在ANSI/ISO C++中,往往将class关键字用typename关键字代替 (2)函数模板的定义可像函数那样将声明和实现两部分分别进行 (3)对于在模板声明部分声明的类型名来说,若模板声明部分是在函数模板原型声明前 面,则类型名的作用域仅在函数模板原型范围内;若模板声明部分是在函数模板定义或实现前面,则类型名的作用域是该函数的作用域范围 15.1.2 函数模板实例化函数模板的实例化分为隐式实例化和显式实例化 1. 隐式实例化 #include iostream using namespace std; template class T1, class T2 // 定义函数模板 T1 sum(T1 x, T2 y) { return x+y; } int main() { coutsum(2,a)endl; // 结果为99 coutsum(a,2)endl; // 结果为c coutsum(2.2, 5.5)endl; // 结果为7.7 coutsum(2, 5.5)endl; // 结果为7 return 0; } 程序运行结果如下: 2. 显式实例化 [例Ex_FTExplicit] 函数模板的显式实例化 #include iostream using namespace std; template class T1, class T2, int ZZZ // 定义函数模板 T1 sum(T1 x, T2 y) { return x+y+ZZZ; } int main() { coutsumint, char, 3(2,a)endl; // 结果为102 coutsumdouble,double, 5(2, 5.5)endl; // 结果为12.5 return 0; } 程序运行结果如下: 15.1.3 函数模板具体化 函数模板实例化的目的是指定实际调用时的实际类型及给带有数据的参数指定初值,但对于有些实参,如带有new连续内存空间的类对象,则会因为内存空间的不良操作而导致实例化函数调用终止 对于这种类型(CName)的myswap模板函数操作应重写其具体化代码,称为函数模板的具体化(Specialization)。 15.1.4 函数模板重载 函数模板重载能允许多个同名的函数模板存在,但同名的各个函数模板的模板声明部分的形参和函数头中的形参必须有区别:要么形参的个数不同,要么形参的个数相同但参数的通用类型名不同 要注意函数模板重载后,其实例化不能出现“二义性” 当同名普通函数和同名函数模板同时出现在代码中时,要注意调用的优先级 [例Ex_TSwap] 函数模板的重载示例。 #include iostream #include cstring using namespace std; class CName { char *name; // 姓名 public: CName( char* str = NULL ) { if (str) { name = new char[strlen(str)+1]; strcpy(name, str); } } ~CName() { if (name) { delete []name; name = NULL; } } void SetName(char* str) { if (name) { delete []name; name = NULL; } if (str) { name = new char[strlen(str)+1]; strcpy(name, str); } } char* GetName(void) { return name; } }; template class T, int ID //
显示全部