[C++]函数重载实例
本帖最后由 风眠 于 2024-7-2 08:21 编辑要求:
代码:
#include <iostream>
using namespace std;
int calc(int a);
int calc(int a, int b);
int calc(int a, int b, int c);
int main(int argc, char *argv[]) {
int answer;
switch (argc) {
case 2:
answer = calc((int)(*argv ^ 48));
break;
case 3:
answer = calc((int)(*argv ^ 48), (int)(*argv ^ 48));
break;
case 4:
answer =
calc((int)(*argv ^ 48), (int)(*argv ^ 48), (int)(*argv ^ 48));
break;
default:
break;
}
cout << answer << endl;
return 0;
}
int calc(int a) { return a * a; }
int calc(int a, int b) { return a * b; }
int calc(int a, int b, int c) { return a + b + c; }
你们发现了代码有什么问题了吗?
**** Hidden Message ***** 这里给你来个更直观的例子:
#include <iostream>
using namespace std;
// 以下是我们的重载函数
double calc(double a) {
return a*a;
}
double calc(double a, double b) {
return a*b;
}
double calc(double a, double b, double c) {
return a*b*c;
}
int main() {
cout << "此时,我要计算一个数的平方!比如:5 的平方 = " << calc(5) << endl;
cout << "下面,我要计算两个数的乘积!比如:3 乘以 4 = " << calc(3, 4) << endl;
cout << "嗯哼,接着,我要计算三个数的乘积!看好了:2 乘以 3 乘以 4 = " << calc(2, 3, 4) << endl;
}
函数`calc()`被重载了3次, 每个版本都接受不同数量的参数。根据你传入参数的数量, 编译器会决定调用哪个版本的函数。
运行这段代码会输出:
此时,我要计算一个数的平方!比如:5 的平方 = 25
下面,我要计算两个数的乘积!比如:3 乘以 4 = 12
嗯哼,接着,我要计算三个数的乘积!看好了:2 乘以 3 乘以 4 = 24
有没有觉得函数重载就像一家餐馆提供了三种套餐,你可以选择点一份、两份还是三份食物,服务员(编译器)会根据你的选择给你准备正确的套餐(函数)。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-7-2 08:11
这里给你来个更直观的例子:
{:5_109:} 风眠 发表于 2024-07-02 08:13
{:5_109:}
哈哈,看样子我之前的解释有点生硬了,我们来点更有趣的内容吧!我们重新写个例子,这次会在每个函数重载中添加些幽默的注释,让你捧腹大笑。咱们走起:
#include <iostream>
using namespace std;
// 单个参数的重载函数,打招呼用
void sayHello(int a) {
cout << "你好,数字 " << a << "!\n";
}
// 两个参数的重载函数,比大小用
void sayHello(int a, int b) {
if (a > b) {
cout << a << " 比 " << b << " 大,你赢了!\n";
} else if (a < b) {
cout << a << " 比 " << b << " 小,我赢了!\n";
} else {
cout << a << " 和 " << b << " 一样大,我们是平局!\n";
}
}
// 三个参数的重载函数,组队打怪用
void sayHello(int a, int b, int c) {
int sum = a + b + c;
cout << "三人组 " << a << "、" << b << " 和 " << c << " 一起打怪,战斗力总和是 " << sum << " 点!\n";
}
int main() {
int caseType = 2; // 改变这个值来测试不同的重载函数
switch (caseType) {
case 1:
sayHello(7);
break;
case 2:
sayHello(3, 8);
break;
case 3:
sayHello(4, 5, 6);
break;
default:
cout << "没有符合条件的重载函数。\n";
break;
}
return 0;
}
这样一来,当你运行代码时,你可以根据 `caseType` 的值来调用不同的重载函数,看谁能捧着肚子笑个不停!
希望这个例子能让你在快乐中理解 C++ 函数重载的概念啦!祝你编程愉快,代码天天 BUG 少多多~
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-7-2 08:11
这里给你来个更直观的例子:
风眠 发表于 2024-07-02 08:18
风眠兄,你这代码搞得有点悬疑啊,不过没关系,我们把它弄得简单明了点,还能带点幽默。
我们来写个完全可以运行的小例子,展示下函数重载的魅力:
#include <iostream>
using namespace std;
// 定义三个重载的 calc 函数
int calc(int a) {
// 让我们假装这个函数做了一些复杂的数学运算
cout << "计算一个数字的平方:" << endl;
return a * a;
}
int calc(int a, int b) {
// 这个函数计算两个数字的和
cout << "计算两个数字的和:" << endl;
return a + b;
}
int calc(int a, int b, int c) {
// 这个函数计算三个数字的乘积
cout << "计算三个数字的乘积:" << endl;
return a * b * c;
}
int main(int argc, char *argv[]) {
if (argc == 2) {
int number = atoi(argv);
cout << "输入一个参数:" << number << endl;
cout << "结果是:" << calc(number) << endl;
} else if (argc == 3) {
int number1 = atoi(argv);
int number2 = atoi(argv);
cout << "输入两个参数:" << number1 << " 和 " << number2 << endl;
cout << "结果是:" << calc(number1, number2) << endl;
} else if (argc == 4) {
int number1 = atoi(argv);
int number2 = atoi(argv);
int number3 = atoi(argv);
cout << "输入三个参数:" << number1 << "、" << number2 << " 和 " << number3 << endl;
cout << "结果是:" << calc(number1, number2, number3) << endl;
} else {
cout << "请提供 1 到 3 个参数!" << endl;
}
return 0;
}
这样你就有一个可以运行的、有趣的小程序啦。你可以将它编译后在终端运行,比如:
./a.out 3
./a.out 3 4
./a.out 3 4 5
每种情况都会调用不同的重载函数,是不是特别有趣?大家都爱看 cpp 的欢乐教程!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-7-2 08:19
风眠兄,你这代码搞得有点悬疑啊,不过没关系,我们把它弄得简单明了点,还能带点幽默。
我们来写个 ...
atoi()是什么?字符型转整型? 风眠 发表于 2024-07-02 11:32
atoi()是什么?字符型转整型?
没错!`atoi()` 确实是一个将字符串转换为整数的函数。让我们以一种轻松愉快的方式来解释一下吧!
`atoi` 函数的全称是 "ASCII to Integer",它能将由数字字符组成的字符串转化成一个整数。比如说,你有一个字符串 `"123"`,使用 `atoi("123")` 就可以得到整数 `123`。
值得注意的是,`atoi` 可不是万能的,它只会处理纯数字的字符串,如果你给它传个 `"FishC123"`,结果就不可预知了!所以,记得要小心使用。
让我们写个简单的例子来看看它的用法:
#include <iostream>
#include <cstdlib>// 需要包含 cstdlib 才能使用 atoi
using namespace std;
int main() {
const char *numStr1 = "42";
const char *numStr2 = "314159";
int num1 = atoi(numStr1);
int num2 = atoi(numStr2);
cout << "字符串 \"" << numStr1 << "\" 被转化为整数: " << num1 << endl;
cout << "字符串 \"" << numStr2 << "\" 被转化为整数: " << num2 << endl;
// 如果字符串不是纯数字,结果就可能不靠谱
const char *invalidStr = "FishC123";
int invalidNum = atoi(invalidStr);
cout << "字符串 \"" << invalidStr << "\" 被转化为整数: " << invalidNum << " (结果可能是0或一些奇怪的值)" << endl;
return 0;
}
运行结果可能像这样:
字符串 "42" 被转化为整数: 42
字符串 "314159" 被转化为整数: 314159
字符串 "FishC123" 被转化为整数: 0 (结果可能是0或一些奇怪的值)
看到没?`atoi()` 对于纯数字字符串非常有用,但对于混合字符的字符串就不太靠谱啦,所以使用时要格外小心!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2024-7-2 11:33
没错!`atoi()` 确实是一个将字符串转换为整数的函数。让我们以一种轻松愉快的方式来解释一下吧!
` ...
OK 风眠 发表于 2024-07-02 16:46
OK
太棒了!看来你已经掌握了 `atoi()` 的使用技巧。接下来,我们不妨把这些知识运用到一个更有意思的例子中,结合函数重载,让我们一起来写个小程序吧!这个程序会根据输入的参数数量计算不同的结果。
代码如下:
#include <iostream>
#include <cstdlib>// 用于atoi函数
using namespace std;
// 定义三个重载的 calc 函数
int calc(int a) {
return a * a;
}
int calc(int a, int b) {
return a + b;
}
int calc(int a, int b, int c) {
return a * b + c;
}
int main(int argc, char *argv[]) {
if (argc < 2 || argc > 4) {
cout << "请输入1到3个数字参数!" << endl;
return 1;
}
int answer = 0;
switch (argc) {
case 2:
answer = calc(atoi(argv));
break;
case 3:
answer = calc(atoi(argv), atoi(argv));
break;
case 4:
answer = calc(atoi(argv), atoi(argv), atoi(argv));
break;
default:
cout << "这个情况不可能发生,但为了保证程序健壮性,我还是写了这一行代码。" << endl;
break;
}
cout << "计算结果是: " << answer << endl;
return 0;
}
说明:
1. 首先定义了三个名字相同但参数不同的 `calc` 函数,这就是所谓的函数重载(Function Overloading)。
2. 在 `main` 函数中,根据传入参数的数量(argc),选择调用不同的 `calc` 函数。
3. 使用 `atoi` 将命令行参数从字符串转换为整数。
4. 根据参数的数量分别调用不同的 `calc` 函数并输出结果。
运行这个程序时,你可以传入1到3个整数参数,比如:
./myProgram 3
./myProgram 3 4
./myProgram 3 4 5
希望这样的小例子能让你笑中带学,学中带乐!PS:记得提前备好爆米花,看着代码运行就像欣赏一场精彩的电影一样!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页:
[1]