鱼C论坛

 找回密码
 立即注册
查看: 776|回复: 9

[作品展示] [C++]函数重载实例

[复制链接]
发表于 2024-7-2 08:10:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 风眠 于 2024-7-2 08:21 编辑

要求: 2024-07-02_08-09.png

代码:
#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[1] ^ 48));
    break;
  case 3:
    answer = calc((int)(*argv[1] ^ 48), (int)(*argv[2] ^ 48));
    break;
  case 4:
    answer =
        calc((int)(*argv[1] ^ 48), (int)(*argv[2] ^ 48), (int)(*argv[2] ^ 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; }
你们发现了代码有什么问题了吗?
游客,如果您要查看本帖隐藏内容请回复
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-7-2 08:11:46 | 显示全部楼层
这里给你来个更直观的例子:
#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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 08:13:39 | 显示全部楼层
FishC 发表于 2024-7-2 08:11
这里给你来个更直观的例子:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 08:13:57 | 显示全部楼层


哈哈,看样子我之前的解释有点生硬了,我们来点更有趣的内容吧!我们重新写个例子,这次会在每个函数重载中添加些幽默的注释,让你捧腹大笑。咱们走起:
#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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 08:18:14 | 显示全部楼层
FishC 发表于 2024-7-2 08:11
这里给你来个更直观的例子:

test.zip (3.2 KB, 下载次数: 1)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 08:19:27 | 显示全部楼层


风眠兄,你这代码搞得有点悬疑啊,不过没关系,我们把它弄得简单明了点,还能带点幽默。

我们来写个完全可以运行的小例子,展示下函数重载的魅力:
#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[1]);
        cout << "输入一个参数:" << number << endl;
        cout << "结果是:" << calc(number) << endl;
    } else if (argc == 3) {
        int number1 = atoi(argv[1]);
        int number2 = atoi(argv[2]);
        cout << "输入两个参数:" << number1 << " 和 " << number2 << endl;
        cout << "结果是:" << calc(number1, number2) << endl;
    } else if (argc == 4) {
        int number1 = atoi(argv[1]);
        int number2 = atoi(argv[2]);
        int number3 = atoi(argv[3]);
        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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 11:32:52 | 显示全部楼层
FishC 发表于 2024-7-2 08:19
风眠兄,你这代码搞得有点悬疑啊,不过没关系,我们把它弄得简单明了点,还能带点幽默。

我们来写个 ...

atoi()是什么?字符型转整型?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 11:33:05 | 显示全部楼层
风眠 发表于 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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-7-2 16:46:02 | 显示全部楼层
FishC 发表于 2024-7-2 11:33
没错!`atoi()` 确实是一个将字符串转换为整数的函数。让我们以一种轻松愉快的方式来解释一下吧!

` ...

OK
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-7-2 16:49:47 | 显示全部楼层


太棒了!看来你已经掌握了 `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[1]));
            break;
        case 3:
            answer = calc(atoi(argv[1]), atoi(argv[2]));
            break;
        case 4:
            answer = calc(atoi(argv[1]), atoi(argv[2]), atoi(argv[3]));
            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 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-4 16:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表