模板

                                       (一)

泛型编程的概念
首先看一个栗子
int add(int a,int b)
{
return a+b;
}
double add(double a,double b)
{
return a+b;
}
short add(double a,double b)
{
return a+b;
}
要完成不同参数类行的add计算,显然,我们可以用重载来完成这个事情,但是重载仍然是存在缺点的,我们可以看出它的代码量是极为巨大的,这大大降低了程序猿的幸福感
不仅如此,重载的代码的可维护性也是非常的低,一个出错将会 导致所有的代码全部出错
为了更好的去解决这个问题,我们唯一的方法就是建立一个这样的模子
比入印钞的时候,就会有一个模子,然后每次都用这个模子去刻印,如此遍引出了C++一个重要的概念-----模板
2.函数模板
函数模板因为着一个函数家族的模子,该函数模板与类型无关,在使用的时候被实用化,根据函数实参的类型来确定函数参数的类型
格式
template<typename T1,typename T2…>
举个栗子
template
T add(T& a,T& b)
{
return a+b;
}
就完成了上述不同类型实参的加法操作
下边我们讨论一下函数模板实现的的原理
事实上函数模板并不是真正的函数,而是一个蓝图了,在程序编译阶段,编译器将会根据给定的实参类型将函数模板转化为对应的实参类型,从而完成参数的传递工作
事实上,函数模板就是一种特殊的偷懒方式,用以增强程序猿的快乐感
函数模版刨析
1).函数模板的实例化
用不同类型的参数使用函数模板的过程成为函数模板的实例化,函数模板实例化分为显示实例化和隐士实例化两种方式
那我们上边介绍的add函数为栗
template
T add(T& a,T& b)
{
return a+b;
}
add(1,2);
这里就是一个隐士实例化的过程,其中a和b的类型是有函数自己去推断的
下边说一下函数的显示实例化
先上代码
int a=10;
int b=10;
add(a,b);
使用方法就是在函数名后边显示的用<>引起来,<>里边说明参数的类型
模板参数的调用原则
1.一个非模板函数可以和一个同名的非模板函数同时存在,并且该模板函数还可以被实例化为这个非模板函数
比如:
int add(int a,int b)
{
return a+b;
}
template
T add(T& a,T& b)
{
return a+b;
}
他们是可以共存的,而且模板还可以被实例化为int add(int a,int b)函数
(二)
当名字相同非模板函数和模板函数同时存在的时候,如果所传的实参类型符合非模板函数,那么就会优先调用非模板函数,而不会去调用模板函数,原因其实非常的简单,因为我们的C++是一直致力于追求程序的执行效率的,而实例化的过程实际是会有一定的资源消耗的,所以C++在这里进行了优化
比如:
int add(int a,int b)
{
return a+b;
}
template
T add(T& a,T& b)
{
return a+b;
}
add(1,2);
会优先调用
int add(int a,int b)
{
return a+b;
}
(三)模板类
1.定义的格式
template(class T1,class T2…)
class (类模板名)
{
类成员名
};
举个栗子,就是我们非常常用的vector类
template(class T)
class Vector ()
{
Vector()
:
arr(0),
size(0),
capacity(0)
{}
~Vector();
private:
T* arr;
size_t size;
size_t capacity;
} ;
template
Vector::~Vector()
{
if(arr)
{
delete [] arr;
size=capacity=0;
}
}
当然这个vector只是个栗子,真实的vector绝不是这样子
这里需要注意的是模板类内函数放在类外进行定义的时候需要加模板参数列表
类模板的实例化
类模板的实例化切记要再类模板的名字后边加上<>,然后将实例化的内容放在<>里边
类模板和类函数一样,它并不是真正的类,只要实例化后它才会是真正的类

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值