设为首页收藏本站
查看: 275|回复: 2

5.《剑指C++》之从C到C++(5)

[复制链接]
  • TA的每日心情
    擦汗
    昨天 08:01
  • 签到天数: 760 天

    [LV.10]以坛为家III

    发表于 2020-6-10 15:30:46 | 显示全部楼层 |阅读模式
    本帖最后由 御天行 于 2020-6-12 09:31 编辑

    ======《剑指C++系列》:总目录======

    本讲主要介绍:默认参数
    通常情况下,函数在调用时,形参从实参那里取得值。C++给出了可以不用从实参取值的方法,给形参设置默认值,称为默认参数
    1.默认参数的引入
    定义一个天气预报函数 weatherForcast() 默认的天气即为晴,当天气为晴时,可以省略此参数。若为其它天气,则正常输入其它天气即可(windy/cloudy/foggy/rainy)
    1. #include<iostream>
    2. #include<time.h>
    3. using namespace std;

    4. void weatherForcast(char *w = "sunday"){
    5.     time_t t = time(0);
    6.     char tmp[64];
    7.     strftime(tmp, sizeof(tmp), "%Y/%m/%d %X %A",localtime(&t));
    8.     cout<<tmp<<" today is weather "<<w<<endl;
    9. }

    10. int main(void){

    11.     weatherForcast();
    12.     weatherForcast();
    13.     weatherForcast("rainday");         //传入参数"rainday",则会在结果中输出"rainday"
    14.     weatherForcast();

    15.     return 0;
    16. }
    复制代码

    运行结果如下:


    2.默认参数的声明与顺序
    默认参数的个数必须小于或等于形参的个数,且默认的顺序只能从右开始向左默认,不能跳跃,否则不能通过编译。
    如下:

    myPrint1()myPrint2():默认参数个数小于或等于形参个数,且默认顺序从右开始向左默认,正确
    myPrint3():默认参数从右开始,但中间有跳跃,错误!
    myPrint4()myPrint5():默认参数从左开始,错误!
    小结:默认规则
                                  =========================================================================
                                            1.默认的顺序:从右向左,不能跳跃
                                            2.函数的声明和定义一体时,默认参数在定义(声明)处。声明在前,定义在后,默认参数只能在声明处。
                                            3.默认值可以是常量,全局变量,或是一个函数。
                                            4.实参个数+默认参数的个数>=形参个数

                                  =========================================================================
    3.当重载遇上默认函数(规则冲突)
    一个函数,不能既作重载,又作默认参数。当我们少写一个参数时,系统无法确认是重载还是默认函数,(前面已经讲过:编译器最讨厌做出选择/判断!)如下:
    1. #include<iostream>
    2. #include<time.h>
    3. #include<iostream>
    4. #include<time.h>
    5. using namespace std;

    6. //函数①
    7. void myPrint(int a){}
    8. //函数②
    9. void myPrint(int a, int b=10){}

    10. int main(void){

    11.     myPrint(10,12);
    12.     myPrint(10);

    13.     return 0;
    14. }
    复制代码

    实验效果:

    实验分析:,当我们调用myPrint(10,12)时,含有两个参数,明显函数①不符合,此时编译器知道调用的是含有默认参数的一项(函数②);而当我们调用myPrint(10)时,只传入1个参数,函数①是符合的,而函数②也是符合的(编译器可以认为含有默认参数),遇到这种二义性,编译器无法自己做出判断,因此无法通过编译。
    总结:当重载遇上默认参数,擦出的不是爱情的火花,而是编译器的吐槽。因此,我们在写代码时,要尽量避免这种冲突。

    上一篇:4.运算符重载初探
    下一篇:6.C++之引用(上)

    本帖子中包含更多资源

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

    x
  • TA的每日心情
    开心
    昨天 12:21
  • 签到天数: 1463 天

    [LV.10]以坛为家III

    发表于 2020-6-11 12:32:08 | 显示全部楼层
    楼主辛苦了,感谢楼主无私奉献!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    4 天前
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2020-7-1 10:33:43 来自手机 | 显示全部楼层
    感谢楼主分享
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐 上一条 /3 下一条

    红盟社区--中国红客联盟 

    Processed in 0.062103 second(s), 16 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    Powered by HUC © 2001-2017 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

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