1.模板与泛型编程
C++中的模板包括函数模板和类模板两种。在编程中,我们使用模板,就可以独立于任何特定类型的方式来编写代码,例如标准模板库中的vector容器,就是一个模板类,通过vector<int>,vector<String>等,就可以用vector来包含任何类型的数据。使用类模板或函数模板的编程,我们成为是泛型编程,或模板编程。
2.函数模板的定义和使用
(1)函数模板的定义
template <typename T> int compare(T v1, T v2) {
if (v1 < v2) return -1;
if (v2 < v1) return 1;
return 0;
}
备注:
A)template是c++中定义模板的关键字,<typename T, class U>成为模板的模板形参表,其中typename和class等价的。
(2)模板函数的使用
compare(1, 2);
compare(1.5,3.8);
compare("hello","world");
备注:
A)在使用模板函数时,编译器会根据传入函数的实参类型,来对应的模板形参的实际类型。因此使用模板函数时,不需要显示执行模板形参表的实际类型。
3.类模板的定义和使用
(1)类模板的定义
template <class Type> class Queue {
public:
Queue();
Type & front();
void push(const Type &);
void pop();
private:
//…
}
备注:
A)template <class Type>为定义类模板或函数模板的八股文
(2)类模板的使用
Queue<int> qi;
Queue<String> qs;
备注:
A)在使用类模板时,需要显示指定类模板的类型。例如,Queue<int>其中使用整型来执行模板形参的实际类型。
4.几个其他的问题
(1)无论是类模板还是函数模板,都是一个蓝图,本身不是一个类或函数,编译器用模板产生指定的类或函数的特定类型版本。产生模板的特定类型实例的过程称为模板的实例化
(2)有继承语言特性带来的多态性,是程序运行时体现出来的,称为运行时多态性。泛型编程的多态性,是在编译阶段体现的,称为编译时多态性。
(3)Java中也有泛型编程,是从C++中借鉴过去的,是类似的。