C++函数模板和普通函数的区别以及调用规则

先看如下代码

template<class T>
T myPlus(T a, T b)
{
	return a + b;
}

int myPlus2(int a, int b)
{
	return a + b;
}

最直接的区别就是:模板函数比普通函数多了template<class T>,模板函数的参数类型在定义时不确定,而普通函数的参数在定义时就已经确定。

继续看如下测试代码

int b = 20;
char c = 'c'; // a = 97 
myPlus(a, c);

以上代码编译无法通过,为什么呢?因为模板函数要求传入的参数必须是一致的类型,很明显a是int ,c 是char ,两个参数的类型不一致,所以无法编译通过。

模板函数和普通函数也可以发生重载

template<class T>
void myPrint(T a ,T b)
{
	cout << "模板调用的myPrint" << endl;
}

void myPrint(int a, int  b)
{
	cout << "普通函数调用 myPrint" << endl;
}

以上代码模板函数和普通函数就发生了重载

测试代码如下

	int a = 10;
	int b = 20;
	myPrint(a, b);

那么此时,调用myPrint(),调用的是模板函数还是普通函数呢?答案是普通函数,因为在重载的情况下,会优先寻找普通函数。

如果我非要让myPrint()调用的是模板函数,应该怎么做呢?只需要在myPrint后面加上<>就可以了,如下

	int a = 10;
	int b = 20;
	myPrint<>(a, b);

那么继续测试如下代码

	char a = 10;
	char b = 20;
	myPrint(a, b);

此时,再调用myPrint()调用的模板函数还是普通函数呢?答案是模板函数,原因是编译器在寻找普通函数时,并没有发现普通函数中有char 类型的参数,所以这时,就优先使用模板函数了。

函数模板也可以发生重载,示例如下

template<class T>
void myPrint(T a ,T b)
{
	cout << "模板调用的myPrint" << endl;
}

template<class T>
void myPrint(T a, T b ,T c)
{
	cout << "模板调用的myPrint(a,b,c)" << endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值