c++primer第十六章模板和泛型编程小结-16

来源:互联网 发布:android数独游戏源码 编辑:程序博客网 时间:2024/06/11 12:51

第十六章---模板和泛型编程


1、泛型编程:以独立于任何特定类型的方式编写代码。使用泛型程序时,我们需要提供具体程序实例所操作的类型或值。标准库的容器、迭代器和算法都是泛型编程的例子。每种容器(如:vector)都有单一的定义,但可以支持定义许多不同种类的vector,他们的区别在于所包含的元素类型。模板是泛型编程的基础。


2、面向对象编程所依赖的多态性称为运行时多态性,泛型编程所依赖的多态性称为编译时多态性或参数式多态性。对于运行时多态
性,只要使用基类的引用或指针,基类类型或派生类类型的对象就可以使用相同的代码。在泛型编程中,我们所编写的函数和类能够多态的用于跨越编译时不相关的类型。一个类和一个函数可以用来操纵多种类型的对象。


3、模板形参可以是表示类型的类型形参,也可以是表示常量表达式的非类型形参。与调用函数模板形成相比,使用类模板时,必须
为模板形参显式指定实参。模板形参由关键字class或typename后接说明符构成,这两个关键字具有相同的含义。


4、函数模板是一个独立于类型的函数,可作为一种方式,产生特定的函数版本。

template <typename T>int compare(const T &v1, const T &v2){if(v1<v2) return -1;if(v2<v1) return 1;return 0;}
模板定义以关键字template开始,后接模板形参表,模板形参表是用尖括号扩住的一个或多个模板形参的列表,形参之间以逗号隔。模板形参表不能为空。


5、类型形参的实参的受限转换:

const转换:接受const引用或const指针的函数可以分别用非const对象的引用或指针来调用。如果函数接受非引用类型,形参类型和实参都忽略const。数组或函数指针的转换:如果模板形参不是引用类型,则对数组或函数类型的实参应该用常规指针转换。当形参为引用时,数组不能转换为指针。


6、调用类模板成员函数比调用类似函数模板更灵活。当在类模板作用域外部定义成员模板的时候,必须包含两个模板形参表。
模板特化:该定义中一个或多个模板形参的实际类型或实际值是指定的。对具有同一模板实参集的同一模板,程序不能既有显式特化又

有实例化。

模板特化:该定义中一个或多个模板形参的实际类型或实际值是指定的。

部分特化:类模板的一个版本,其中指定了某些但非全部的模板形参

对具有同一模板实参集的同一模板,程序不能既有显式特化又有实例化。


7、当在类模板作用域外部定义成员模板的时候,必须包含两个模板形参表。


8、命名空间

一个命名空间是一个作用域,通过在命名空间内部定义库中的名字可以避免全局名字的冲突。同一个命名空间可以不连续的分布在多个文件内,但未命名命名空间为每个文件独有,只能在文件内部不连续分布,不同的文件未命名空间代表不同的作用域。命名空间中的成员在程序运行的开始处即进行初始化,因此命名空间中的成员在程序中可以通过作用域限制直接使用,也可以通过using指示或using声明使用。using指示由于使整个命名空间中所有成员成为可见,大量使用时会重新引入命名冲突问题,成为命名空间污染。using指示将命名空间成员提升到外围作用域,当在类的成员函数中使用using指示时,命名空间的成员具有与类成员相同的作用域。如果在命名空间中使用模板特化,则模板的现实特化必须在定义通用模板的命名空间中声明。


9、多重继承:

多重继承时,如果同名函数在多个基类中出现将产生二义性。派生类中名字的查找首先发生在派生类内,如果在派生类内没有找到该函数,则在多个基类中同时查找(只检查函数名称),一旦找到多个函数具有相同名称,则该处产生二义性,如果只找到一个名称匹配的函数,则检查该函数调用是否合法(函数是否匹配)。
多重继承时,一个基类可能在派生层次中出现多次,此时派生类会拥有多个相同的基类,使用基类对象时会产生二义性。虚继承可以使多个相同基类在派生类中只被共享一次。在虚继承下,对给定虚基类,无论该类在派生层次中作为虚基类出现多少次,只继承一个共享的基类子对象。

0 0