C++程序函数的重载和函数模板示例代码

 更新时间:2024年03月18日 12:06:22   作者:觉醒法师  
C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名的函数用来实现不同的功能,这就是函数的重载,这篇文章主要介绍了C++程序函数的重载和函数模板,需要的朋友可以参考下

在C++中,函数也可以重载。C++允许在同一作用域中用同一函数名定义多个函数,这些函数的参数个数和参数类型不相同,这些同名的函数用来实现不同的功能,这就是函数的重载。

函数的重载的函数体是完全相同的,只是形参和类型不同,也要分别定义。为了解决这个问题,C++提供了函数模板(function template)。函数模板,实际上是建立一个通用函数类型和形参类型不具体指定,用一个虚拟的类型来代表,这个通用函数就称为函数模板。

一、函数的重载

求两个数中最大的值(分别考虑整数、浮点数、长整数的情况)。代码如下:

#include <iostream>
using namespace std;
// 求最大值 - 整数
int max(int x, int y){
	int z;
	if(x > y) z = x;
	else z = y;
	return z;
}
// 求最大值 - 浮点数
float max(float x, float y){
	float z;
	if(x > y) z = x;
	else z = y;
	return z;
}
// 求最大值 - 长整数
long max(long x, long y){
	long z;
	if(x > y) z = x;
	else z = y;
	return z;
}
int main(){
	int a, b;
	float c, d;
	long e, f;
	// 输入流
	cin >> a >> b;
	cin >> c >> d;
	cin >> e >> f;
	// 计算大小
	int max_int = max(a, b);
	float max_float = max(c, d);
	long max_long = max(e, f);
	//输出内容
	cout << "int max value:" << max_int << endl;
	cout << "float max value:" << max_float << endl;
	cout << "long max value:" << max_long << endl;
}

编译结果如下:

运行结果如下:

二、函数模板

通过上面例子可以看出,函数重置的函数体是完全相同的,只是形参的类型不同。很多人自然会想到,对此是否能简化。刚好C++提供了函数模板,可以解决这个问题。

2.1 分号错误

在定义函数模板时,需要注意的是结束位置是不需要加分号的,除非是在模板声明之后紧跟着另一个独立的语句。如果在函数模板声明结束位置添加分号后,编译器在处理这额外的分号会报错:“[Error] expected unqualified-id before ';' token”和“[Error] 'T' does not name a type”。代码如下:

template <typename T>;    // 错误写法

将结束位置分号去掉即可,代码如下:

template <typename T>    // 正确写法

或者后面紧跟独立语句,可添加分号,代码如下:

// 模板声明
template <typename T>
// 定义通用函数,用T作虚拟类型名
T get_max(T a, T b){
	T c;
	if(a > b) c = a;
	else c = b;
	return c;
};

2.2 重载命名错误

可能是自己的代码中定义了额外的 max 重载版本,这些版本与标准库中的 max 函数产生了冲突,或者其他原因,导致继续使用max命名函数时,编译时程序报错:“[Error] call of overloaded 'max(int&, int&)' is ambiguous”。

编译器在尝试调用名为 max 的重载函数时,发现了多个匹配的重载版本,但它无法确定应该使用哪一个,因此调用是模棱两可的(ambiguous)。导致错误代码如下:

#include <iostream>
using namespace std;
// 模板声明
template <typename T>
// 定义通用函数,用T作虚拟类型名
T max(T a, T b){
	T c;
	if(a > b) c = a;
	else c = b;
	return c;
}
int main(){
	int a = 10, b = 15, max_int;
	float c = 23.2, d = 32.22, max_float;
	long e = 63425, f = -232, max_long;
	// 计算最大值
	max_int = max(a, b);
	max_float = max(c, d);
	max_long = max(e, f);
	// 输出数据
	cout << "int max value:" << max_int << endl;
	cout << "float max value:" << max_float << endl;
	cout << "long max value:" << max_long << endl;
	return 0;
}                                              

因此,这边将max修改为get_max后,错误即可解决了。

2.3 函数模板实现

这里将上面例子通过函数模板重新实现一遍,前面已将函数模板定义分号问题和函数命名问题解决后,正确代码如下:

#include <iostream>
using namespace std;
// 模板声明
template <typename T>
// 定义通用函数,用T作虚拟类型名
T get_max(T a, T b){
	T c;
	if(a > b) c = a;
	else c = b;
	return c;
}
int main(){
	int a = 10, b = 15, max_int;
	float c = 23.2, d = 32.22, max_float;
	long e = 63425, f = -232, max_long;
	// 计算最大值
	max_int = get_max(a, b);
	max_float = get_max(c, d);
	max_long = get_max(e, f);
	// 输出数据
	cout << "int max value:" << max_int << endl;
	cout << "float max value:" << max_float << endl;
	cout << "long max value:" << max_long << endl;
	return 0;
}                                              

编译结果如下:

运行结果如下:

到此这篇关于C++程序函数的重载和函数模板的文章就介绍到这了,更多相关C++函数重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C语言特殊符号的补充理解

    C语言特殊符号的补充理解

    这篇文章主要为大家介绍了C语言特殊符号的使用补充理解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-02-02
  • C语言二分查找算法及实现代码

    C语言二分查找算法及实现代码

    本文主要介绍C语言的二分查找算法,这里给大家详细介绍了什么是二分查找,并提供代码实例,需要的小伙伴可以参考下
    2016-07-07
  • C++ ncnn模型验证精度实现代码

    C++ ncnn模型验证精度实现代码

    这篇文章主要介绍了C++ ncnn模型验证精度实现过程,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • 详解c++实现信号槽

    详解c++实现信号槽

    这篇文章主要为大家介绍了c++实现信号槽,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-12-12
  • C++实现五子棋小程序

    C++实现五子棋小程序

    这篇文章主要为大家详细介绍了C++实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • 在编程语言中怎样定义队列及其使用(C++)

    在编程语言中怎样定义队列及其使用(C++)

    这篇文章主要介绍了在编程语言中怎样定义队列,本文主要根据c++来介绍,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-03-03
  • C++中perror和fprintf区别解析

    C++中perror和fprintf区别解析

    本文主要对比了C语言中的两个函数perror和fprintf的区别,perror主要用于输出与系统错误相关的消息,根据全局变量errno的值生成错误信息,而fprintf则用于格式化输出任意类型的信息到指定的文件流
    2024-10-10
  • C语言实例上手深入理解操作符的使用

    C语言实例上手深入理解操作符的使用

    C 语言提供了丰富的操作符,有:算术操作符,移位操作符,位操作符,赋值操作符,单目操作符,关系操作符,逻辑操作符,条件操作符等。接下了让我们在实例中练一下
    2022-05-05
  • C语言常见排序算法之交换排序(冒泡排序,快速排序)

    C语言常见排序算法之交换排序(冒泡排序,快速排序)

    这篇文章主要介绍了C语言常见排序算法之交换排序(冒泡排序,快速排序),冒泡排序即Bubble Sort,类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排
    2022-07-07
  • C语言中qsort函数的用法实例详解

    C语言中qsort函数的用法实例详解

    这篇文章主要介绍了C语言中qsort函数的用法实例详解的相关资料,希望通过本文能帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10

最新评论