目录
引入/泛型编程
关于模板这个版块,用简单的话来说就是我们在平常的时候,就说两个数相加,我们就要写好多类型: 整型.字符型.double .float 等等…我们利用模板,就是只写一个统一的函数,可以将所有同类型的函数进行涵盖,从而减少重复代码的出现,提高我们的效率,也节省了空间.
1.函数模板
概念
函数模板就相当于将所有的整型 .浮点,等…全部都组成一个家族,在进行参数化的时候,根据分析后具体需要哪个函数参数,对其进行匹配就可以了.
格式
----定义其要将那个数编程模板
template<typename T1, typename T2,…,typename Tn>
返回值类型: 函数名(参数列表){}
举例:
template<typename T> //定义T为模板变量
void Swap(T& a, T& b){ //将T写在函数内部即可
T tmp = a;
a = b;
b = tmp;
}
原理
主要就是编译器内部进行一系列的操作把模板类型的函数转成我们需要的函数类型
实例化
1)隐式实例化
隐式实例化就是让编译器内部自己检测所转换的函数类型
void test(){
int a = 1, b = 2;
char d = 'm', e = 'n';
double f = 1.3;
double g = 5.94;
//类型推演:
//隐式实例化(一般)
Swap(a, b);
Swap(d, e);
Swap(f, g);
}
2)显式实例化
显式实例化就是我们进行人为的规定,让其转成哪一种类型
我们可以加----<类型>----来让我们对于类型可以手动操作
void test(){
int a = 1, b = 2;
char d = 'm', e = 'n';
double f = 1.3;
double g = 5.94;
//类型推演:
//隐式实例化
Swap<int>(a, e); //转成整型
Swap<duoble>(b, d); //转成double型
Swap<float>(f, a); //转成float型
}
匹配规则
1.当调用的函数类型存在模板型和普通型时,有限调动普通型
2.如果函数模板可以实例化一个更加匹配的函数,走实例化
3.如果指明需要进行实例化,则直接实例化
2.类模板
例题理解
如果我们对函数模板认识的差不多了,下面认识类模板的话,我们直接通过例题来直接实现,如下:
template<class T>
class Vector{
public :
Vector(size_t capacity = 10)
: _pData(new T[capacity])
, _size(0)
, _capacity(capacity)
{}
// 使用析构函数演示:在类中声明,在类外定义。
~Vector();
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;
_size = _capacity = 0;
}
重要: 在类模板中函数在类外进行定义的时候,在类的内部需要添加函数的声明,这样才能够调用过去!
类模板的实例化
void test(){
//错误写法,不能进行实例化
//seqList sq;
//类模板实例化之后,真正的类型-->类名<模板参数类型>
//只能走显式实例化
vector<int>sq(10);
vector<double>sq2(10);
}
这一节的内容比较的单一,主要是加深我们对于木板的理解和模板带给我们的方便,还有就是对于一些基础的应用的相关内容.多敲代码!!!加油!!!