一,模板介绍
由来:在C语言中,每次使用数据结构的时候都得自己写一个,而且还不支持多个类型的使用,必须重新换一个类型适应要求。
所以C++就提出模板的概念,它要能支持多种类型的使用,而不是只能用一种类型,并且给你放在库里,你可以直接使用。
二,函数模板
1,为什么不用重载替代模板?
重载虽然可以实现多种类型的使用,但是重载复用性太低,每次有新的类型都需要重新加入。
代码维护性低,一个代码出错可能影响其他的重载。
2,函数模板概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定 类型版本
3.函数模板格式
template<typename T1, typename T2,......,typename Tn> 返回值类型 函数名(参数列表){}
注意:typename是用来定义模板参数关键字,也可以使用class(切记:不能使用struct代替class)
4.模板参数实例化
隐式类型实例化:不告诉模板具体实例,让它自己去推导,但是不能有多个类型,编译器不知道该推成哪一个。
显示类型实例化:ADD(a,(int)b) 可以用这种方式,也可以显示给定 ADD<int> (a,b);
注意:如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。
5,对于非模板函数和同名函数模板,如果其他条件都相同,在调动时会优先调用非模板函数而不会从该模 板产生出一个实例。如果模板可以产生一个具有更好匹配的函数, 那么将选择模版
6.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函 数
三,vector的简单模板实现
// 动态顺序表
template<class T>
class Vector
{
public :
Vector(size_t capacity = 10)
: _pData(new T[capacity])
, _size(0)
, _capacity(capacity)
{}
// 使用析构函数演示:在类中声明,在类外定义。
~Vector();
void PushBack(const T& data)
{
// _CheckCapacity();
_pData[_size++] = data;
}
void PopBack()
{
--_size;
}
size_t Size()
{
return _size;
}
T& operator[](size_t pos)
{
assert(pos < _size);
return _pData[pos];
}
private:
T* _pData;
size_t _size;
size_t _capacity;
};
template <class T> Vector<T>::~Vector()
{
if(_pData)
{
delete[] _pData;
}
}