文章目录
1. 泛型编程
如何实现一个通用的交换函数呢?
为解决的问题:
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
void Swap(double& left, double& right)
{
double temp = left;
left = right;
right = temp;
}
void Swap(char& left, char& right)
{
char temp = left;
left = right;
right = temp;
}
......
每个类型都要定义一个函数;太过繁琐;
那能否告诉编译器一个模子,让编译器根据不同的类型利用该模子来生成代码呢?
解:
祖师爷发明了模板;
2.函数模板
2.1函数模板的概念
函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。
2.2函数模板格式
template<typename T1, typename T2,…,typename Tn>
或template<class T1,class T2……class Tn>
返回值类型 函数名(参数列表){}
注意:
这里的调用的不是一个函数;
原理图:
面试考题:
函数的两个参数的类型不同使用函数模板怎么解决:
解决方法:
1.
cout《Add((int)1.1,2)《endl;
2.
cout<<Add(1.1,(double)2)<<endl;
3.
cout<<Add<int>(1.1,2)<<endl;
2.3 函数模板的应用
1.swap函数:
注意:c++中的库函数包括swap函数;
这是库函数中的定义:
使用了模板将类型可以多样化;
2.参数无法实现类型的传递
解决方法:显示实例化使用尖括号将类型传给函数;
3.当出现特定函数和通用函数同时存在时
函数调用会调用最符合的函数;
3.类模板
3.1 类模板的定义格式
template<typename T1, typename T2,…,typename Tn>
或template<class T1,class T2……class Tn>
返回值类型 函数名(参数列表){}
template<class T1, class T2, ..., class Tn>
class 类模板名
{
// 类内成员定义
};
// 动态顺序表
// 注意: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);
void PopBack();
// ...
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;
_size = _capacity = 0;
}
3.2 类模板的实例
注意和函数有区别:这里没有参数无法将类型传给类模板;
所以出现了类模板的实例化
// Vector类名,Vector<int>才是类型
Vector<int> s1;
Vector<double> s2;
两对象调用的类不同
3.3 类外定义函数;
3.3.1 声明和定义在一个文件内
由此例子来加讲解类名和类型的区别:
不使用模板的情况:
类名和类型相同;即Vector;
使用模板时:
类名:Vector
类型:Vector
类外定义需要声明和使用类型定义:
类外定义的步骤:
1.类内声明
2.类外定义声明;
3.定义;(注意使用类型)
Vector::~Vector()
{}
3.3.2 声明和定义不在一个文件
这种情况;追号不要使用;容易报错;