C++程序设计教程--读书笔记14 模板

第十四章
 
一、知识点
1、由于事物的相似性,设计的类型和函数有时也表现出相似甚至相同性。将这些相似的类型和函数归纳起来构成一个类族或函数族,用一种统一的方式来编程就是模板编程。(P481)
 
2、函数模板的定义形式为:(P 482)
template <类型参数表>
返回类型  函数模板名(数据参数表)
{
     函数模板定义体
}
例如:
template <typename T>
void swap(T& a, T& b){
     T temp = a;
     a = b;
     b = temp;
}
 
3、函数模板不是函数,它是以具体的类型为实参来生成函数体的模板。函数模板定义被编译时,不会产生任何执行代码。函数模板定义只是对未来生成的函数体的描述,表示它每次能单独处理在模板形参表中说明的数据类型。(P483)
 
4、使用函数模板,就是以函数模板名为函数名的函数调用。其形式为:(P483)
函数模板名(数据实参表);
第一次使用函数模板时,会触发编译器产生一个对应函数模板的函数体定义
当编译器发现有一个函数模板名为函数名的调用时,将根据数据实参表中的对象或变量的类型,确认是否匹配函数模板中对应的数据形参表,然后生成一个函数。该函数的定义体与函数模板的定义体相同,而数据形参表的类型则以数据实参表的类型为依据。该函数成模板函数。
 
5、数据实参的演绎:数据实参的类型->匹配数据形参的类型->确认模板实参->推得模板形参的过程。
以函数模板名为函数名的函数调用,以数据实参推演函数模板实参,进而生成模板函数定义的过程称为函数模板的实体化或实例化。(P484)
 
6、模板函数调用时寻求函数模板的类型参数匹配,类型实参与类型形参的匹配规则与函数的数据实参类型与数据形参类型匹配规则不同。类型实参与类型形参的匹配规则更苛刻。(P485)
 
7、对于常量引用型参数,可以通过显式模板类型指定来规定调用的代码。对于调用中的几个数据实参类型不同,而数据形参类型却要求相同时,用显式模板类型指定的方法是必要的,否则模板参数将拒绝匹配。如:(P487)
int ia = 3;
double db = 5.0;
cout << max<double>(is, db) << "\n";
 
8、引用型形参,由于要求数据形参与数据实参的捆绑,访问数据形参就是访问数据实参,因此要求数据实参应为左值表达式,不能为常量或字面值。(P487)
 
9、模板机制规定,如果一个调用既匹配普通函数,又匹配模板函数,则先匹配普通函数。(P489)
 
10、类模板不是类,但可以借此生成模板类,一般在首次定义模板类的对象时,生成模板类。模板类以模板名打头,后跟尖括号括起来的类型实参。C++标准中,也将模板当做类型来看。(P471)
 
11、模板类一般指从类模板产生的类。通常通过传递给类模板以类型实参而得到模板类。模板类名表示为模板名后面跟带尖括号的类型实参表。(P474)
 
12、根据类型创建对象的过程称为类型的实例化。根据模板创建类型定义或函数定义的过程是模板的实例化。类模板实例化后,构成模板类,或称类模板实例。函数模板实例化后,构成模板函数,或称为函数模板实例。(P476)
 
13、如果不想用预定义的类模板来生成模板类,而是以该模板类名自己专门重写一个模板类,则得到模板铸件。得到模板铸件的过程,称为模板定做。模板定做时,必须以template<>开始,然后在class 后跟类模板名,即定义需要定做的类。定做时,成员可以在原先类模板的基础上随心所欲地增删,因此,定做的实现可以与类模板的实现完全不同。定做的成员函数不再是模板函数而是普通函数了,类模板中的成员中的类型参数T将被定做的类型取代。(P477)
 
14、模板定做不一定要全部定做,即不一定非得要将类模板定做成普通类。如果一个类模板的类型参数多余一个,而定做其中一部分类型参数为确定的类型,则成为局部定做。模板一旦局部定做,则产生的模板铸件就仍然是类模板。(P480)
 
15、在C++中,多态是通过虚函数来实现的。然而,模板也可以表现多态。但是,模板表现的多态不是在运行中进行动态识别的,而是在编译时刻进行静态识别的,因而前者称为动多态,后者称为静多态。(P486)
 
16、动静多态的差异:
(1)、动多态适合于类层次结构,而且基类必须为多态类,即含有虚成员函数。静多态适合于所有的类,不需要虚函数。
(2)、表现动多态的函数总是通过指针或者引用传递参数;而静多态则可以是传对象,也可以传指针或引用。
(3)、表现动多态的函数只处理特定的类层次结构中的系列对象,一个类系列,配一个表现动态的专用函数。而静多态则随着传递实参的类型,进行函数模板的特例化。
(4)、对于容器操作,若要实现多态,也是一个类系列单独做这种容器。而静多态容器则适合所有的类,随着异种类系列的参数,会生成不同的模板类。
(5)、从性能上来说,静多态优于动多态;从错误检测上来说,一个实体,如果不具某种操作,而程序中又动态地捆绑该操作,则必须在运行中才能发现该错误。而静多态则是编译时检查类型匹配的,如果在实例化过程中,发现一个实体没有该操作,会及时报错。(P490)
posted on 2012-05-06 19:35  谷堆旁边  阅读(557)  评论(0编辑  收藏  举报