辽河油田建设有限公司网站,班级网站建设模板,wordpress第三方登录插件,wordpress 树形菜单插件在C中#xff0c;函数也可以重载。C允许在同一作用域中用同一函数名定义多个函数#xff0c;这些函数的参数个数和参数类型不相同#xff0c;这些同名的函数用来实现不同的功能#xff0c;这就是函数的重载。 函数的重载的函数体是完全相同的#xff0c;只是形参和类型不同… 在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;
} 编译结果如下 运行结果如下