1009模板03普通函数与函数模板的区别

88 阅读1分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 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;
}

image.png

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