[C++]模板类和模板函数
参考:
C++ 中模板使用详解
C++模板详解
概念
为了避免因重载函数定义不全面而带来的调用错误,引入了模板机制
定义
模板是C++支持参数化多态的工具,使用模板可以使用户为类或者函数声明一种一般模式,使得类中的某些数据成员或者成员函数的参数、返回值取得任意类型。
- 模板是一种对类型进行参数化的工具
- 使用模板的目的是为了编写出与类型无关的代码
- 注意:模板的声明或定义智能在全局、命名空间或类范围内进行。不能在局部范围,函数内部进行。
分类:
- 函数模板
- 针对类型不同的参数
- 类模板
- 针对数据成员和成员函数类型不同的类
函数模板
template <class 形参名,class 形参名,......> 返回类型 函数名(参数列表)
{
函数体
}
说明: template是一个声明模板的关键字,表示声明一个模板关键字class不能省略,可以用typename 代替。<>括号中的参数叫模板形参
一但声明了模板函数就可以用模板函数的形参名声明类中的成员变量和成员函数,即可以在该函数中使用内置类型的地方都可以使用模板形参名
模板形参需要调用该模板函数时提供的模板实参来初始化模板形参,一旦编译器确定了实际的模板实参类型就称他实例化了函数模板的一个实例。比如swap的模板函数形式为
template <class T> void swap(T &a,T &b){}
注意:不能在函数调用的参数中指定模板形参的类型,对函数模板的调用应使用实参推演来进行。
类模板
template< class 形参名, class 形参名,...> class 类名
{...};
类模板和函数模板都是以template开始后接模板形参列表组成,模板形参不能为空,一但声明了类模板就可以用类模板的形参名声明类中的成员变量和成员函数,即可以在类中使用内置类型的地方都可以使用模板形参名来声明。
template<class T> class A{public: T a; T b; T hy(T c, T &d);};
在类A中声明了两个类型为T的成员变量a和b,还声明了一个返回类型为T带两个参数类型为T的函数hy。
类模板的创建
比如一个模板类A,则使用类模板创建对象的方法为A
注意:对于类模板,模型的形参的类型必须在形参列表中指定,类模板形参不存在实参推演的问题
类模板外部定义成员函数的方法
template<模板形参列表> 函数返回类型 类名<模板形参名>::函数名(参数列表){函数体}
//本博客内容用以记录各种知识点,大部分为网络搜集,来历不明,侵删。