第14章模板 模饭( emplate)是C++语言代码重用和多态性的一个集中 表现。模板是提供这样一个转换机制:由程序员定义一种操作 或一个类,而该操作或类却可以适应几乎所有的数据类型。在 定意义上,模板类似宏定义或函数重载,但它书定更为简洁, 使用更加灵活,适应性更强。 模板分函数模板和类模板。前者为程序员编写通用函数提供了 种手段;而后者则为程序员设计通用类奠定了基础
第14章 模板 模板(Template)是 C++ 语言代码重用和多态性的一个集中 表现。模板是提供这样一个转换机制:由程序员定义一种操作 或一个类,而该操作或类却可以适应几乎所有的数据类型。在 一定意义上,模板类似宏定义或函数重载,但它书定更为简洁, 使用更加灵活,适应性更强。 模板分函数模板和类模板。前者为程序员编写通用函数提供了 一种手段;而后者则为程序员设计通用类奠定了基础
141函数模板 14.1.1定义模板函数 利用函数模板定义的函数叫做模板函数,定义模板函数应具有 以下的一般形式 template type Function Name(arg list) ∥ Function Body 其中:关键字 template指出下面将要说明的是一个模板;而 则是该函数所要求的参数,这里的cass与类无关, 而是与参数名T一起指出:“这是一个用户定义的数据类 型”,它与一对尖括号是模板语法的组成部分
14.1 函数模板 14.1.1 定义模板函数 利用函数模板定义的函数叫做模板函数,定义模板函数应具有 以下的一般形式: template type Function_Name(arg_list) { // Function_Body; } 其中:关键字 template 指出下面将要说明的是一个模板;而 则是该函数所要求的参数,这里的 class 与类无关, 而是与参数名 T 一起指出:“这是一个用户定义的数据类 型”,它与一对尖括号是模板语法的组成部分
例:定义模板函数 ∥/ MAXMIN. H template T Max(T a, T b) return(a>b)? a: b: template T Min(T a, T b) return(a <b)?a: b:
例:定义模板函数 // MAXMIN.H template T Max(T a, T b) { return (a > b) ? a : b; } template T Min(T a, T b) { return (a < b) ? a : b; }
定义模板函数时应注意 1.在模板的参数表中,至少得有一个参数的数据类型为模板 的参数类型T;模板函数的返回值的数据类型也可以为T。 2.模板可以带有多个不同数据类型的参数,比如 template int f(T1 arg1, T2 arg2, T3 arg3 3.模板参数的数据类型也可以是已存在的数据类型,比如 template T f(T arg) int i= n
定义模板函数时应注意: 1. 在模板的参数表中,至少得有一个参数的数据类型为模板 的参数类型 T;模板函数的返回值的数据类型也可以为 T。 2. 模板可以带有多个不同数据类型的参数,比如: template int f(T1 arg1, T2 arg2, T3 arg3) { //… } 3. 模板参数的数据类型也可以是已存在的数据类型,比如: template T f(T arg) { int i = n; //… }
4.函数可以带有模板中未给出的、已存在的数据类型的参数, 比如: template T f(T arg, int n) 5.模板函数的函数体中必须使用模板参数
4. 函数可以带有模板中未给出的、已存在的数据类型的参数, 比如: template T f(T arg, int n) { //… } 5. 模板函数的函数体中必须使用模板参数
1412使用模板函数 调用模板函数与调用一般函数的方法无二致 例:使用Max()和Min()模板函数 include include maxmin. h void maino 程序的输出为: nti=3,j=5; float f1=12.34,f2=23.45; 12.34 b cout < Max(i,j<< endl; cout < Min(f1, f2)<< endl; cout < Max(a,b")
14.1.2 使用模板函数 调用模板函数与调用一般函数的方法无二致。 例:使用 Max()和 Min()模板函数 #include #include "maxmin.h" void main() { int i = 3, j = 5; float f1 = 12.34, f2 = 23.45; cout << Max(i, j) << endl; cout << Min(f1, f2) << endl; cout << Max('a', 'b') } 程序的输出为: 5 12.34 b
14.2类模板 14.2.1定义模板类 利用类模板定义的类叫做模板类。定义模板类具有如下的一般 形式: template classClass Name I ∥ Members }
14.2 类模板 14.2.1 定义模板类 利用类模板定义的类叫做模板类。定义模板类具有如下的一般 形式: template class Class_Name { // Members; };
例:定义模板类 ∥ ANYTYPE.H template class Any Type I private T X, y3 public Any Type(T a, T b): x(a), y(b) 1 void SetX(T a)I X=a; 1 void SetY(T b) y=b GetXo return x T GetO return y;1 ∥/ End of anyTyPe.h
例:定义模板类 // ANYTYPE.H template class AnyType { private: T x, y; public: AnyType(T a, T b) : x(a), y(b) {} void SetX(T a) { x = a; } void SetY(T b) { y = b; } T GetX() { return x; } T GetY() { return y; } }; // End of ANYTYPE.H
上例中,模板类 Any Type中所有成员函数均在类中定义成内 联函数。实际上,与一般类相同,模板类中的任一成员函数均 可以在类外定义。在类外定义成员函数的一般形式与定义模板 函数基本相同: template:: Func_ Name(ages) ∥ Function Bod 请注意这里类名的写法:模板类与普通类的不同之处在于模板 类的类名一定具有C| ass Name的形式
上例中,模板类 AnyType 中所有成员函数均在类中定义成内 联函数。实际上,与一般类相同,模板类中的任一成员函数均 可以在类外定义。在类外定义成员函数的一般形式与定义模板 函数基本相同: template type Class_Name :: Func_Name(ages) { // Function_Body; } 请注意这里类名的写法:模板类与普通类的不同之处在于模板 类的类名一定具有 Class_Name 的形式
例:定义一个栈模板类 ∥/ ANYSTACK.H #if I defined ANYSTACK H define ANYSTACK H template class Any Stack I private T StackIn int TopMost int Top public Any Stack(: TopMost(n), Top(o) int Push(D) int Pop(T&)
例:定义一个栈模板类 // ANYSTACK.H #if !defined _ANYSTACK_H_ #define _ANYSTACK_H_ template class AnyStack { private: T Stack[n]; int TopMost; int Top; public: AnyStack() : TopMost(n), Top(0) {} int Push(T); int Pop(T&); }