C++程序设计之模板
1、模板(templates) 1、针对“一个或多个尚未明确的数据类型(包括类类型)”所设计的函数或类。 2、在不确定要操作数据的类型的情况下就实现操作方法。 3、模板是在函数和类的基础上提供了更高一层的抽象。
2、函数模板的概念:利用函数模板(带类型参数的函数),一次定义出具有共性的一组函数1、除类型参数外 2、函数名相同,参数个数相同 3、返回类型可以不同4、 处理多种不同类型数据的函数
3、函数模板的说明返回类型 函数名(参数表){函数体};template <模板参数表> 函数定义;template:关键字。指明为函数模板或类模板。模板参数表:用尖括号括起来,一个或多个模板参数,用“,”分开。模板参数:其格式为class<类名>,其中的类名是一个标识符,该类名对应的实参类型可以是任何类型。
4、函数模板在被调用时与同名的函墙绅褡孛数调用没有什么区别函数调用过程:1)首先搜索程序说明中是否有参数表恰与罪焐芡拂max(c1,c2)之参数表完全相同的同名函数,如果有,就调用此函数代码付诸执行。否则执行下一步;2)检查是否有函数模板,经适当实例化成为参数匹配的同名函数。如果有,调用此实例化的模板函数代码付诸执行。否则执行下一步;3)检查是否有同名函数,可经参数的自动转换后实现参数匹配。如果有,调用该函数代码付诸执行;4)如果三种情况都未找到匹配函数,则按出错处理;5)值得注意的是,模板函数调用时,与一般函数不同之处在于,它不允许类型的转换。模板函数也可以重载。同样,重载的条件是二同名模板函数必须有不同的参数表。
5、template <模板参数表> class 类模板名{类模板定义体};template:关键字,指明本说明为类模板说明或函数模板说明。模板参数表:用尖括号< ,>括起来,用来说明若干个类型形参或普通形参。
6、模板参数表1、类型形参 :class 类型形参名2、普通形参 :类型 普通形参名注意函数模板不许使用普通形参!
7、类模板的使用利用类模板(带类型参数或普通参数的类):1、一次定义具有共性的一组类。 2、所定义类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值都可以是任意类型的 3、将程序所处理对象(数据)的类型参数化 4、提高了程序的抽象层次与可重用性
8、不能使用类模板来直接生成对象,故须首先对模板参数指定“实参”TestClass<char, 10> objA;//以char 取代类型形参T 并以10 取代普通形参i 后形成的具体类TestClass<double, 8> objB;//以double 取代类型形参T 并以8 取代普通形参i 后形成的具体类也可以用由用户定义的类(类型)来进行实例化。TestClass <complex,15> complexArray;TestClass <point,20> points;
9、类体外定义类模板的成员函数,其定义格式类似于函数模板。template <模板参数釉涑杵抑表> 函数类型 类模板名<模板参数名字表>稆糨孝汶;::成员函数名 ( 函数参数表 ){... //成员函数的函数体};template <class T,int i> T TestClass<T,i>::getData(int j){ ... //成员函数的函数体};
10、类模板的参数类模板是对于类的进一步抽象,被称为类属类,可以说是类的类。1、模板的定义体现了这个集合中的类的共性; 2、模板参数则标识出集合中类的区别。
11、类模板也允许有静态成员。它们是类模板之实例化类的静态成员,而不属于类模板。template<class T>class C{static T t; //静态成员t};CA<int>aiobj1, aiobj2;CA<char>acobj1, acobj2;
12、类模板的友元1、友元函数为一般函数 它将是该类模板的所有实例化类的友元函数;2、友元脑栲葱蛸函数为一函数模板,但其类型参数与类模竣淠仝螃板的类型参数无关。 该函数模板的所有实例化(函数)都是类模板的所有实例化类的友元;3、更复杂的情形是,该友元函数为一函数模板,且它与类模板的类型参数有关。 可能只是该类模板的某些特定实例化(而不是所有实例化)类的友元。
13、特例版本类模板的使用十分方便,但大多数类模板不能任意进行实例化。C++语言中没有对模板的“实参”类型进行检查的机制,仅仅是通过实际操作中发生语法错误时,才能指出实例化的错误。以下案例,如采用用户定义类型而又未在该类中对运算符“<<”进行重载时,就会产生问题:
14、按不同方法来派生类模板1)一般类(其中不使用类型参数的类)作基类,派生出类模板(其中要使用类型参数)。
15、2)类模板作基类,派生出新的类模板。但仅基类中用到类型参数T(而派生的类模板中不使用T)。
16、3)类模板作基类,派生出新的类模板,且基类与派生类中均使用同一个类型参数T。
17、4)类模板作基类,派生出新的类模板,但基类中使用类型参数T2,而派生类中使用另一个类型参数T1(而不使用T2)。