普通函数与函数模板区别以及两者的调用规则
普通函数与函数模板区别
两者区别主要围绕可不可以隐式类型转换
- 普通函数调用时,编译器可以发生自动类型转换(隐式类型转换)。
- 函数模板调用有两种方式(自动类型推导以及显示指定类型)
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换。
- 如果利用显示指定类型的方式,可以发生隐式类型转换。
案例如下:
#include <iostream>
using namespace std;
int myAdd(int a, int b) {
return a + b;
}
template<typename T>//声明一个函数模板,告诉编译器代码中的T不要报错,T是一个通用数据类型(泛型思想)(返回值类型和参数类型可以指定为通用类型T,调用时指定T的类型)
T myAdd01(T a, T b) {
return a + b;
}
void test() {
int a = 10;
char b = 'a';
//1、普通函数调用时,编译器可以发生自动类型转换(隐式类型转换)。
cout<<myAdd(a, b)<<endl;//b隐式转换为整型,'a'自动转换为整型,'a'对应的ASCII码为97
//2、函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换。
//cout << myAdd01(a, b) << endl;//报错没有与参数列表匹配的 函数模板"myAdd01"实例,参数类型为:(int char)
//自动类型推导不会发生隐式类型转换,要传递