初识模板
C++有个概念叫泛型编程,即编写与类型无 ,关的通用代码。模板就是其实现基础。模板分为函数模板和类模板。模板不支持分离编译,也就是声明在.h文件中,定义在.cpp中。
为什么使用模板
- 模板可以具有非类型参数,用于指定大小,可以根据指定的大小创建动态结构
- 模板最重要的一点就是类型无关,提高了代码复用性
- 模板运行时不检查数据类型,也不保证类型安全,相当于类型的宏替换
- 只要支持模板语法,模板的代码就是可移植的
函数模板
template <class T>
T Add(const T& x1, const T& x2)
{
return x1 + x2;
}
上面代码在调用时就可以根据传入参数的类型,自动推导出T的类型。这个过程叫做模板的实例化。模板也支持显式实例化,也就是规定好T的类型。如下所示。
int a = 2;
double b = 4.1;
auto ret = Add<int>(a, b);
其中,函数模板规定T是int类型。b是double类型,赋值给int&时,会发生隐式类型转换。也可以不显式调用,对参数进行强制类型转换,使两个参数是同一类型。
类模板
类模板定义格式如下:
template <class T>
class 类模板名
{
};
类模板中的函数放在类外进行定义时,需要加模板参数列表:
template <class T>
与函数模板不同的是,类模板只能显示实例化,例如:
Vector<int> v1;
需要注意的是:
- 类模板是一个类家族,模板类是通过类模板实例化的具体类
- C++中类模板的声明格式为template<模板形参表声明><类声明>,并且类模板的成员函数都是模板函数
|