模板初阶(C++)

初识模板

模板分为 函数模板和类模板这两种,模板可以理解为是一套固有的方法,通过改变里面不同的载体( 参数类型)进而调高代码的复用性。这是一个经典案例,在不使用模板的情况下,若遇见不同类型的参数,需要不断的编写函数。这样不利于提高代码的编写效率。
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;
}

函数模板

template是模板函数的关键字有的也会写成class,(但是两者在后面会有明显的区别后面会结合具体案例进行介绍这里不进行深入介绍),typename 指的是类型名称 ,这里的T是取自type的简写,T可以置换成其他字母也是可以的。模板参数的类型是根据传入的参数进行自动识别类型,在遇见传入参数类型不同,需要为不同的类型进行分别做标记

//调用相同类型的模板

template<typename T>

//调用不同类型的模板

template<typename T1,typename T2>

 函数模板使用案例:

1.调用相同类型

#include<iostream>
using namespace std;
template<typename T>
void Swap(T& left, T& right)
{
    T temp = left;
    left = right;
    right = temp;
    cout << left <<" " << right << endl;

}
int main()
{
    int a = 2, b = 3;
    double c = 3.3, d = 4.4;
    Swap(a, b);
    Swap(c, d);
}
运行结果

 2.调用不同类型

 这里是模板参数类型不同的情况,a和c的类型不同,这里有两种解决办法。1.用户自身进行转换。2.就是进行显式实例化。我这里用了用户自身强制转换。

 函数模板的原理

上面案例,我们会产生一个疑问使用函数模板调用的是同一个函数吗?这里我们可以通过反汇编观察一下底层代码函数是如何进行调用的,这里可以看出调用的并不是一个函数,而是两个函数。

反汇编角度下的函数模板原理

 

显式实例化

在函数名+ <> 中指定模板参数的实际类型

隐式实例化

隐式实例化是通过自动识别的,隐式实例化如果遇见参数列表中,参数不同时就会报错。

 为什么当出现同名,同条件时会优先调用非函数模板

在调用函数模板的时候会首先,要分别自动识别各个参数的类型,在识别后才会进行函数的调用,而非函数模板是不用调用可以直接执行的。所以会优先调用非函数模板。如果出现调用参数类型与非函数模板不同时就会优先调用函数模板。

int add(int left, int right)
{
	return (left + right)*2;
}
template<typename T>
T add( T left,  T right)
{
	return left + right;
}
int main()
{
	int a = 2, b = 3;
	cout << add(a,b) << endl;

	return 0;
}

类模板

template<typename/class T,typename/class T,.....>

class 类名

{

}

 类模板的实例化

类模板的类型:类模板名字<参数类型>

 补充:类模板只能显示实例化,因为类模板并未进行构造传参。所以类的类型的书写形式是 类模板名字<参数类型>。

如何在类模板范围之外使用类模板

在类模板中声明和定义不能分离,因为类模板使用的范围只能在类的里面出了就不能再进行使用,如果使用就会进行报错

 解决方案:

 总结

以上就是本次知识点总结主要涉及函数模板和类模板基础知识点,以及使用的语法细节,最后期待能留下你的一键三连(点赞,关注,收藏)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值