STL:函数模板(基本语法、原理)、与普通函数一起调用区别

一.STL作用

由于C++相比较于Java没有交换函数,所以每次需要使用时,都需要自己写一个,并且还会出现数据类型不同,就要编写不同的函数,非常麻烦。因此,出现STL。
模板技术、类型参数化,编写代码可以忽略类型。

//int型交换
void Myswap(int& a, int& b) {
	int temp;
	a = temp;
	a = b;
	b = temp;
}
//double型交换
void Myswap(double& a, double& b) {
	double temp;
	a = temp;
	a = b;
	b = temp;
}

二.template(模板)关键字

作用:为了让编译器区分是普通函数还是模板函数。

template<class T>
//或者
template<typename T>

告诉编译器下面要写模板函数。且只对下面第一个函数生效
例子:上面函数可以改写为:

template<class T>
void Myswap(T& a, T& b) {
	T temp = a;
	a = b;
	b = temp;
}

使用:

Myswap<int>(a1, b1);
//或
Myswap(a1, b1);

三.函数模板和普通函数的区别

1. 函数模板不准许自动类型转化
2. 普通函数能够自动进行类型转化

template<class T>
int MyAdd1(T& a, T& b) {
	return a + b;
}
int MyAdd2(int a,char b) {//重载
	return a + b;
}
int main() {
	int a = 10;
	int b = 20;
	char c1 = 'a';
	char c2 = 'b';
	cout << "MyAdd1()=" << MyAdd1(a, b) << endl;
	cout << "MyAdd2()=" << MyAdd2(a, c1) << endl;
}

结果:
在这里插入图片描述
但是如果是使用模板类,参数为int和char就会报错。
在这里插入图片描述
原因:MyAdd2()会自动将char转为int型,而模板类不会。

四.函数模板和普通函数一起调用规则

1. 函数模板可以像普通函数那样被重载
2. C++编译器优先考虑普通函数
3. 如果函数模板可以产生一个更好的匹配,那么选择函数模板
4. 可以通过空模板实参列表的语法限定编译器只能通过匹配模板

对于2解释:

template<class T>
T MyAdd(T& a, T& b) {
	return a + b;
}
int MyAdd(int a,int b) {//重载
	return a + b;
}

int main() {
	int a = 10;
	int b = 20;
	char c1 = 'a';
	char c2 = 'b';
	MyAdd(a, b);
}

结果:调用普通函数
在这里插入图片描述
对于4的解释:

template<class T>
T MyAdd(T& a, T& b) {
	return a + b;
}
int MyAdd(int a,int b) {//重载
	return a + b;
}

int main() {
	int a = 10;
	int b = 20;
	char c1 = 'a';
	char c2 = 'b';
	MyAdd<>(a, b);//空模板实参列表
}

结果:调用模板函数
在这里插入图片描述

五.函数模板实现原理

在这里插入图片描述

MyAdd(int a, int b);//产生模板一
MyAdd(float c, float d);//产生模板二
MyAdd(int e, int f);//调用模板一

在生产一个int型模板后,后续再次使用,只需要调用之前生产的模板类。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值