C++从开始到放弃第七天
1.泛式编程
使用函数重载会有几个缺陷:
1.重载的函数仅仅只是类型不同,代码的复用率较低,只要有新的类型出现,就需要增加对应的函数。
2.代码的可维护性低,一个出错可能所有的重载都出错。
泛式编程:编写与类型无关的通用代码。
2.函数模型
template<typename T1, typename T2,…,typename Tn>
返回值类型 函数名(参数列表){}
template<class T>//常用
template<typename T>//不常用
void Swap(T&left, T&right)
{
T tmp = left;
left = right;
right = tmp;
}
函数模板的原理
在编译器编译阶段对于模板的使用,编译器需要根据传入的实参类型推演出生成的函数以供调用。
函数模板的实例化
template<typename T>
void Swap(T&left, T&right)
{
T tmp = left;
left = right;
right = tmp;
}
int main()
{
int a = 0;
double b = 2.5;
Swap(a, b);
}
函数并不能编译通过,为什么?
因为在模板中,函数一般不会进行类型操作,转化会出现问题。
两种解决方法:1.自己进行类型转化。2.使用显式实例化
Swap(a, (int) b);
Swap<int>(a,b);
如果类型不匹配,编译器会尝试进行隐式类型转换,如果无法转换成功编译器将会报错。
模板匹配原则
1.非模板函数可以和一个同名模板同时存在。
2.对于非模板函数和同名模板函数,在调用时会优先调用非模板函数。
3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换。
3.类模板
#include<iostream>
using namespace std;
template<class T>
class Vector
{
public:
Vector(size_t capacity = 10)
:_Pdate(new T[capacity])
, _size = 0
, _capacity = capacity
{
}
~Vector();
void PushBack(const T& data)
{
_Pdate[_size] = data;
_size++;
}
T& operator[](size_t index)
{
return _Pdate[index];
}
private:
T* _Pdate;
size_t _size;
size_t _capacity
};
template <class T>
Vector<T>::~Vector()
{
if (_Pdate)
{
delete[] _Pdate;
}
}
Vector不是具体的类,是编译器根据被实例化的类型生成具体类的模具
实例化:
Vector<int> s1;
Vector<double> s2;