携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第17天,点击查看活动详情
1. 普通函数和函数模板的区别
普通函数与函数模板区别:
- 普通函数调用时可以发生自动类型转换(隐式类型转换)
- 函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
- 如果利用显示指定类型的方式,可以发生隐式类型转换
2.普通函数调用时可以发生自动类型转换(隐式类型转换)
- 普通函数现两数相减
#include<iostream>
#include <fstream>
#include <string>
using namespace std;
int sub(int a, int b) {
return a - b;
}
int main() {
int a = 10;
int b = 9;
cout << "a - b = "<< sub(a,b)<<endl;
system("pause");
return 0;
}
输出:
a - b = 1 请按任意键继续. . .
- 发生自动类型转换
int main() {
char a = 'a';
int b = 9;
cout << "a - b = "<< sub(a,b)<<endl;//正确,将char类型的'a'隐式转换为int类型 'a' 对应 ASCII码 97
system("pause");
return 0;
}
输出:
a - b = 88 请按任意键继续. . .
- 字符型变量转换成整型变量 a = 97
3.函数模板调用时,如果利用自动类型推导,不会发生隐式类型转换
- 函数模板实现两数相减
template<typename H>
H sub(H a, H b) {
return a - b;
}
int main() {
int a = 10;
int b = 9;
cout << "a - b = "<< sub(a,b)<<endl;
system("pause");
return 0;
}
输出:
a - b = 1 请按任意键继续. . .
- 改变a的类型
int main() {
char a = 'a';
int b = 9;
cout << "a - b = "<< sub(a,b)<<endl;// 报错,使用自动类型推导时,不会发生隐式类型转换
system("pause");
return 0;
}
4.如果利用显示指定类型的方式,可以发生隐式类型转换
template<typename H>
H sub(H a, H b) {
return a - b;
}
int main() {
char a = 'a';
int b = 9;
cout << "a - b = "<< sub<int>(a, b) <<endl;
system("pause");
return 0;
}
输出:
a - b = 88 请按任意键继续. . .
- 如果用显示指定类型,可以发生隐式类型转换
结论:
建议使用显示指定类型的方式,调用函数模板,因为可以自己确定通用类型T