模板初级阶段

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((int1.12)《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 声明和定义不在一个文件

这种情况;追号不要使用;容易报错;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值