多语言展示
当前在线:1489今日阅读:27今日分享:41

C++程序设计之模板

本人学习C++的过程经验及总结,本文内容:函数模板类模板
工具/原料

VS2015

方法/步骤
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 objA;//以char 取代类型形参T 并以10 取代普通形参i 后形成的具体类TestClass objB;//以double 取代类型形参T 并以8 取代普通形参i 后形成的具体类也可以用由用户定义的类(类型)来进行实例化。TestClass complexArray;TestClass points;

9

类体外定义类模板的成员函数,其定义格式类似于函数模板。template <模板参数表> 函数类型 类模板名<模板参数名字表>::成员函数名 ( 函数参数表 ){... //成员函数的函数体};template T TestClass::getData(int j){   ... //成员函数的函数体};

10

类模板的参数类模板是对于类的进一步抽象,被称为类属类,可以说是类的类。1、模板的定义体现了这个集合中的类的共性;  2、模板参数则标识出集合中类的区别。

11

类模板也允许有静态成员。它们是类模板之实例化类的静态成员,而不属于类模板。templateclass C{static T t; //静态成员t};CAaiobj1, aiobj2;CAacobj1, acobj2;

12

类模板的友元1、友元函数为一般函数       它将是该类模板的所有实例化类的友元函数;2、友元函数为一函数模板,但其类型参数与类模板的类型参数无关。       该函数模板的所有实例化(函数)都是类模板的所有实例化类的友元;3、更复杂的情形是,该友元函数为一函数模板,且它与类模板的类型参数有关。       可能只是该类模板的某些特定实例化(而不是所有实例化)类的友元。

13

特例版本类模板的使用十分方便,但大多数类模板不能任意进行实例化。C++语言中没有对模板的“实参”类型进行检查的机制,仅仅是通过实际操作中发生语法错误时,才能指出实例化的错误。以下案例,如采用用户定义类型而又未在该类中对运算符“<<”进行重载时,就会产生问题:

14

按不同方法来派生类模板1)一般类(其中不使用类型参数的类)作基类,派生出类模板(其中要使用类型参数)。

15

2)类模板作基类,派生出新的类模板。但仅基类中用到类型参数T(而派生的类模板中不使用T)。

16

3)类模板作基类,派生出新的类模板,且基类与派生类中均使用同一个类型参数T。

17

4)类模板作基类,派生出新的类模板,但基类中使用类型参数T2,而派生类中使用另一个类型参数T1(而不使用T2)。

推荐信息