C++初步认识模板

1.前言

最近的blog都完全没人看啊,可能水平确实降低了很多,有点停滞不前了,每篇blog真的都是爆肝完成,我本身学业很重,都要挤出时间来写blog,如果写的blog对大家有帮助的话,麻烦大家点个赞吧,谢谢啦!
这次要向大家介绍C++中的模板,通过认真阅读这篇blog相信一定会对大家对模板有一定的认识,能够初步使用模板。

2.了解泛型编程

在学习C语言的时候,我们在实现swap函数的时候,总是要考虑各种数据类型的交换的问题。

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;
}

写出类似这样的代码, 那么有没有什么办法可以解决这种重复无聊的劳动呢?
当然是有的,这就需要泛型编程来解决这个问题了。
在C++中就有模板,相当于为某个功能设置一个模板,当存在不懂的类型的时候也能通过模板实现相同的功能。
泛型编程:编写与类型无关的通用代码,是代码复用的一个手段。模板是泛型编程的基础

3.函数模板

3.1 概念

函数模板代表了一个函数家族,函数模板与类型无关,在使用时被参数化,根据实参类型产生特定的版本。

3.2函数模板格式

template<typename T1, typename T2, ………,typename Tn>
返回值类型 函数名(参数列表){}

template<typename A>
void Swap(A a, A b)
{
	A t = a;
	a = b;
	b = t;
}
int main()
{
	int a = 2;
	int b = 2;
	Swap(a, b);
	cout << b << '-' << a << endl;
	return 0;
}

注意:typename是用来定义模板参数关键字,和class相同,但不能用struct代替。

3.3 函数模板原理

函数模板并不是函数,而是给编译器提供的一个生成函数的固定模式。其实模板就是将我们之前做过的重复的事情通过交给了编译器。
在编译器的编译阶段,编译器会根据传入实参的数据类型来生成对应类型的函数以供调用。

3.4函数模板的实例化

函数模板分为隐式实例化和显性实例化。

3.4.1 隐式实例化

隐式实例化就是让编译器自己根据传入实参类型推断需要根据模板生成函数的实际类型。

template<typename A>
void Swap(A a, A b)
{
	A t = a;
	a = b;
	b = t;
}
int main()
{
	int a = 2;
	int b = 2;
	Swap(a, b);
	cout << b << '-' << a << endl;
	return 0;
}
3.4.1 显式实例化

显式实例化就是显式说明要传入的参数的类型,当传入的参数与显式声明的参数不同时会将传入的参数强制转换成,不会因为传入参数的类型不同影响程序运行,使用方法就是在函数名后的<>中指定模板参数的实际类型。

int main(void)
{
	int a = 10;
	double b = 20.0;
	// 显式实例化
	Add<int>(a, b);
	return 0;
}

如果类型不匹配,编译器会尝试进行类型转换,如果无法转换成功编译器将会报错。

3.5模板参数的匹配原则

1.一个非模板函数可以和一个同名的函数模板同时存在,而且该函数模板还可以被实例化为这个非模板函数
2.对于非模板函数和同名函数模板,如果其他函数都相同,在调动时会优先调用非模板函数而不会从该模板产生出一个实例。如果模板可以产生一个更好匹配的函数,那么将会选择模板。
3.模板函数不允许自动类型转换,但普通函数可以进行自动类型转换

4.类模板

4.1类模板的定义格式
template <class T1, class T2 ...., class Tn>
class 类模板名
{
	....
};
4.2 类模板的实例化

类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后面跟<>, 然后将实例化的类型放在<>中即可类模板名不是真正的类,而实例化的结果才是真正的类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值