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++函数重载内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Dev C++编译时运行报错source file not compile问题
这篇文章主要介绍了Dev C++编译时运行报错source file not compile问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2024-01-01
最新评论