VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

有编程疑问吗?还请到提问专区发帖提问!
搜索
查看: 2391|回复: 71

《实用C++》第34课 函数的重载与默认参数

  [复制链接]
51_avatar_middle
online_admins Syc 发表于 2018-4-21 02:13:30 | 显示全部楼层 |阅读模式
1、函数重载的由来:
在平时的编程过程中,一个函数可能就实现一个功能,多个功能就需要多个函数。但有时候多个功能之间很像,只是一些细节有差异,那么类似这样的功能能不能写成一个函数呢?例如,要求2个数中比较大的数,这两个数的类型有时候是int类型,有时候是float类型,那么我们按照之前的写法应该是这样封装函数:
  1. int max_int(int a, int b);
  2. float max_float(float a, float b);
复制代码

所以,用户在调用的时候就要根据不同的参数类型,调用不同名字的函数,如果要求两个int类型的数中的比较大的就要调用 max_int,如果要求两个float类型的数中的比较大的就要调用 max_float,能不能叫一个名字呢?让系统自己去适配到底调用哪个?答案是可以的。例如:
  1. int max_num(int a, int b);
  2. float max_num(float a, float b);
复制代码

实际上这就是函数的重载。
C++允许同一函数名定义多个函数,这些函数的参数类型和个数可以不相同,而且至少要有一个不相同,如果都相同的话就会报重复定义的链接错误了。使一个函数名可以多用。

2、函数重载的要求:
重载函数的参数个数、参数类型、参数顺序 三者中必须至少有一种不同(不然会产生调用疑惑)。函数的返回值类型可以相同也可以不同。
单纯返回值类型不同的两个同名函数不能构成函数重载,会报链接错误。

举个例子:
  1. int max_num(int a, int b);
  2. bool max_num(int a, int b);
  3. float max_num(float a, float b);
复制代码

这样就不行,int max_num(int a, int b); 和 bool max_num(int a, int b); 不满足条件,只有返回值类型不同。这样会导致系统不知道调用哪一个。编译直接报错。
例如:
  1. max_num(2, 5);
复制代码

这时候如果我问你,要调用哪个,你也不能确定,因为我这里根本就没关心返回值返回什么。所以函数的重载也不是说随便重载。

另外,在跟大家说一下,函数的重载一般都是功能相近,或者功能类似的函数进行重载,不能把一些功能相差很大,或者完全不相关的函数叫同一个名字,语法上是没有错误,但是违背函数重载设计的初衷啦。

3、函数的默认参数:
我们来举个例子,实现一个函数,求出某个int类型数组的最大值和最小值,之前是当做一个小作业给大家出题来着,还有的网友问这个问题,详情见帖子:
http://www.cctry.com/thread-289893-1-1.html
那么现在呢,我想让这个函数更灵活一些,有的时候我只想求最大值,有的时候我只想求最小值,有的时候我同时求最大值和最小值。
void get_min_max(int src[], int arr_len, int* max_v, int* min_v);
能不能不让我每次都得定义两个 int 类型的变量用来接收数组中的最大值和最小值。我需要最大值就给我最大值,我需要最小值就给我最小值。如何才能办到呢?
通过函数的默认参数就可以做到。

修改方法:
函数的声明改成如下:
  1. void get_min_max(int src[], int arr_len, int* max_v = NULL, int* min_v = NULL);
复制代码

函数的定义改成如下:
  1. void get_min_max(int src[], int arr_len, int* max_v, int* min_v)
  2. {
  3.     if (arr_len < 0 || (!max_v && !min_v)) return;

  4.     int var_max = src[0], var_min = src[0];
  5.     for (int i = 1; i < arr_len; ++i)
  6.     {
  7.         if (var_min > src[i]) var_min = src[i];
  8.         if (var_max < src[i]) var_max = src[i];
  9.     }

  10.     if (max_v) *max_v = var_max;
  11.     if (min_v) *min_v = var_min;
  12. }
复制代码


之后调用的时候,例如:
  1. int main()
  2. {
  3.     int src[] = { 66, 33, 55, 22, 88, 89, 19 };

  4.     int max_v = 0;
  5.     get_min_max(src, sizeof(src) / sizeof(int), &max_v); //只获取最大值
  6.     cout << "最大值是:" << max_v << endl;

  7.     int min_v = 0;
  8.     get_min_max(src, sizeof(src) / sizeof(int), NULL, &min_v); //只获取最小值
  9.     cout << "最小值是:" << min_v << endl;

  10.     return 0;
  11. }
复制代码

具体代码讲解见视频教程!

4、函数默认参数的注意事项:
①、在函数声明的时候指定,如果没有函数的声明则可以放在函数的定义中,但是声明和定义只能选一个;
②、从第一个有默认值的参数开始,后面的所有参数必须都有默认值才行;
③、调用的时候如果要自定义非第一个默认值的参数,那么前面所有的参数都要明确的写上默认值才行;
④、从使用角度来说函数的默认值比重载更方便,从函数内部实现角度来说比函数的重载更复杂。

5、函数的默认参数对函数重载所造成的歧义:
例如,也有个名字叫做 get_min_max 的函数,作用是获取参数给定int整型数组的最大值,并通过函数的返回值返回,函数的代码如下:
//返回int数组中的最大值
  1. int get_min_max(int src[], int arr_len)
  2. {
  3.     int var_max = src[0];
  4.     for (int i = 1; i < arr_len; ++i)
  5.     {
  6.         if (var_max < src[i]) var_max = src[i];
  7.     }

  8.     return var_max;
  9. }
复制代码


跟刚才的第4知识点中的函数放在一起会有什么情况发生呢?看看vs2013报不报错?为什么呢?具体见视频教程演示!

6、小作业:
实现一个函数,该函数的声明如下:
bool string_upper_diy(char str[], int str_len, bool b_odd_pos = true);
功能为对字符串指定位置的字符变换为大写。
str 参数为字符串的指针;
str_len 为字符串的长度;
b_odd_pos 为true的时候,就要将 str 字符串中的奇数位置的字符变为大写,同时将非奇数位置的字符变为小写;
b_odd_pos 为false的时候,就要将 str 字符串中的奇数位置的字符变为小写,同时将非奇数位置的字符变为大写;
奇数指的是:1,3,5,7,9,11,13,15,17,19...以此类推;
大家明白了吗?动手试着做一做!

第34课免费试看,下载地址回复后可见:
游客,如果您要查看本帖隐藏内容请回复

#######################################################
获得所有教学视频、课件、源代码以及售后答疑详见:
《实用C++》:http://www.cctry.com/thread-275996-1-1.html
VC驿站官方客服QQ:8260671

#######################################################




上一篇:第27课作业实在不行了,脑袋都晕了……
下一篇:《实用C++》第35课 类的构造函数与析构函数

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

98_avatar_middle
在线会员 tomok 发表于 2018-4-21 09:16:14 | 显示全部楼层
好好学习


发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
在线会员 tomok 发表于 2018-4-21 09:16:34 | 显示全部楼层
好好学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

98_avatar_middle
在线会员 tomok 发表于 2018-4-21 09:16:52 | 显示全部楼层
好好学习
继续跟进

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

78_avatar_middle
在线会员 csa 发表于 2018-4-21 22:16:04 | 显示全部楼层
更新很快,不错,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
在线会员 hbjdt 发表于 2018-4-22 08:28:27 | 显示全部楼层
辛苦了,syc大神

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

84_avatar_middle
在线会员 glgh 发表于 2018-4-22 09:35:36 | 显示全部楼层
感谢分享。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

82_avatar_middle
在线会员 DetectiveY 发表于 2018-4-22 10:54:25 | 显示全部楼层
谢谢分享!!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

61_avatar_middle
在线会员 tingwei3 发表于 2018-4-22 20:56:59 | 显示全部楼层
学习一下,谢谢

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

80_avatar_middle
在线会员 zp521 发表于 2018-4-23 09:08:31 | 显示全部楼层
坚持学习!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

43_avatar_middle
online_vip Conanmilk 发表于 2018-4-23 10:22:23 | 显示全部楼层
学习学习,打卡打卡

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

74_avatar_middle
online_vip08 wssfcn 发表于 2018-4-23 11:37:04 | 显示全部楼层
看看            

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

69_avatar_middle
在线会员 awfymwvf 发表于 2018-4-24 10:14:56 | 显示全部楼层
谢谢SYC更新教程。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

55_avatar_middle
在线会员 Smallbee 发表于 2018-4-24 16:03:47 | 显示全部楼层
函数的重载与默认参数

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

59_avatar_middle
online_vip f364424375 发表于 2018-4-24 19:09:25 | 显示全部楼层
载与默认参数 [修改]

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

94_avatar_middle
online_vip08 Mtong 发表于 2018-4-25 12:40:39 | 显示全部楼层
函数的重载与默认参数

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

26_avatar_middle
在线会员 Bingocbb 发表于 2018-4-25 19:47:28 | 显示全部楼层
        感谢分享!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

05_avatar_middle
在线会员 625136403 发表于 2018-4-26 20:05:02 | 显示全部楼层
好好学习好好学习好好学习

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

97_avatar_middle
online_vip 最后的小攻 发表于 2018-4-28 17:14:21 | 显示全部楼层
在学c#也看看c++有啥区别

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

44_avatar_middle
在线会员 a281288098 发表于 2018-5-3 15:13:55 | 显示全部楼层
多谢楼主用心录制教程。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你已经在论坛发帖求助,并且从坛友或者管理的回复中解决了问题,请编辑帖子并把分类改成【已解决】

如何回报帮助你解决问题的坛友?可以给对方加【热心】【驿站币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /1 下一条

QQ
QQ在线咨询
联系电话
13591366679
手机扫一扫 关注本站精彩内容
wxqrcode

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2018-9-24 20:18

Powered by Discuz! X3.4

© 2009-2018 cctry.com

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