1.C++模板
C++模版是C++泛型编程的基础,一个模版就是一个创建类或函数的公式,比如我们在比较大小时,一般要根据不同数据类型定义不同的函数,比如int 型,double型,char型等,我们要定义三个函数
屏幕快照 2016-08-14 09.56.40.png
以上两个函数基本相同,只是型参类型不同而已。如果每一个这样功能的函数都一一定义显然不符合实际,我们可以使用模板来完成这一工作。
屏幕快照 2016-08-14 10.08.53.png
在使用时,传入不同类型的参数即可
屏幕快照 2016-08-14 10.10.39.png
可以看出,函数模板类似于一个抽象类,具有自动识别的功能,当我们分别传入int和double类型参数时,compare会根据不同类型的参数,进行相应的编译,编译器会推断出模板的参数,我们将这一过程称之为实例化函数模板。
函数模板需要编译两次,第一次是在没有实例化前,编译器检查语法是否错误,第二次是在实例化期间,检查调用是否合法。
在编译过程中,多参数要进行推导,类型是由实参决定,而且不允许自动转换,必须要进行强制转换或者指定转换
2.C++类模板
类模板是用来生成类的公式,与函数模板不同的是,编译器不能为类模板推断模板参数的类型,同时,为了使用类模板,我们必须在模板名后的尖括号中提供额外的信息,用来代替模板参数的模板实参列表。
屏幕快照 2016-08-14 15.44.25.png
在Blob模板中,有一个T类型参数,用来表示Blob保存的元素类型。我们将元素访问操作的反=返回类型定义为T &。当用户实例化Blob时,T就会被替换为特定的模板实参类型。
2.实例化类模板
当使用一个类模板时,我们必须要提供额外的信息,就是显式模板实参,它们被绑定到模板参数,编译器使用这些模板实参来实例化特定的类
比如:
屏幕快照 2016-08-14 16.07.38.png
a和a1使用相同的特定类型版本的Blob,当Blob模板实例化出一个类时,他会重写Blob模板,将模板参数T的每一个实例替换为模板的实参。
3.模板的特化
类模板的特化就是对模版的某些类模板参数类型做特化,特化的好处就是对于一些特殊的类型,可以做一些特别的优化或者是不同的实现,同时也可以避免在实例化类的时候引起一些可能产生的诡异行为。特化一个类模板的时候意味着需要特化其所有数化的成员函数
特化一个类,需要使用如下写法:
屏幕快照 2016-08-16 21.28.27.png
先申明一个template<>的空参数列表类,然后在类名称后面的尖括号中显式指明参数类型。
在类模板中可以进行偏特化,可以理解为部分特化,比如一个类模板定义如下
他的几种偏特化模板如下:
屏幕快照 2016-08-16 21.41.33.png4.容器
容器vector是标准库表示对象的集合,集合中每一个对象都有一个与之对应得索引,索引用于访问对象。容器的基本用法如下:
还有一些操作就不一一举例,在vector使用后应该要进行内存清理,vector的一种内存清理如下:
屏幕快照 2016-08-21 20.17.06.png
网友评论