• 【C++·峰顶计划】缺省参数操作与函数重载细则


    Hi!我是Duoni!

    5cdaa5a944e74302a51ba699ec932941.jpeg


    目录

    🍉缺省参数

    🍉全缺省参数

    🍉半缺省参数

    🍉杂谈浅解

    🍉函数重载

    🍉函数重载实现原则


     

    🍉缺省参数

     

    缺省参数是指:当调用处函数传参为空时,函数体部分则使用函数声明处的缺省值执行函数运算。

     

    1. void Def_num(int val = 1)//缺省参数
    2. {
    3.        std::cout << val << std::endl;
    4. }
    5. int main()
    6. {
    7.        Def_num(5);
    8.        Def_num(2);
    9.        Def_num();//此时不传参数,便会使用缺省参数
    10.        return 0;
    11. }

     

    5552ccbd8d7c4507a3c706ac52f7d8b7.png

     

    tips:缺省参数的逻辑可以很明了的理解为“补漏”。更生活化的理解就是车辆的“备胎”,不到关键时刻绝不会使用。

     


     

    🍉全缺省参数

     

    全缺省参数是指:函数声明处参数都定义有缺省值。

     

    tips:若函数调用处传参不全,不满足函数声明处的参数个数。那么,函数定义处将由左到右接收参数,缺少的则使用缺省值。

     

    传参规则:由左向右(函数定义处参数接收顺序),不可跳跃。

     

    缺省值定义规则: 必须将所有参数都定义缺省值。

     

    附:具体情形以下演示。

     

    1. void Def_num(int val_1 = 33, int val_2 = 66, int val_3 = 99)//都定义缺省值
    2. {
    3.        std::cout << "val_1 = " << val_1 << std::endl;
    4.        std::cout << "val_2 = " << val_2 << std::endl;
    5.        std::cout << "val_3 = " << val_3 << std::endl;
    6.        std::cout << std::endl;
    7. }
    8. int main()
    9. {
    10.        Def_num(5);//5传给val_1,少参数位使用缺省值,语法正确
    11.        Def_num(5,6);//从左向右规则,缺参数使用缺省值,语法正确
    12.        Def_num(5,6,7);//同理,语法正确
    13.       //Def_num(,6,7);//语法错误,不得跨越传参
    14.        //Def_num(5,,7);//语法错误,不得跨越传参
    15.        return 0;
    16. }

     

    b8975ea25d85419496123dad5747c411.png

     


     

    🍉半缺省参数

     

    半缺省参数是指:函数声明参数进行部分缺省值定义,遵守缺省值定义规则。

     

    传参规则:从左向右(接收参数),不得跨越传参(传参处)。

     

    缺省值定义规则:缺省值定义必须从右向左定义,必须连续缺省,不得跨越。

     

    1. //void Def_num(int val_1 = 33, int val_2, int val_3)//从左向右定义缺省值,违反语法
    2. //void Def_num(int val_1 = 33, int val_2, int val_3 = 99)//跨越定义缺省值,语法错误
    3. void Def_num(int val_1, int val_2 = 66, int val_3 = 99)
    4. {
    5.        std::cout << "val_1 = " << val_1 << std::endl;
    6.        std::cout << "val_2 = " << val_2 << std::endl;
    7.        std::cout << "val_3 = " << val_3 << std::endl;
    8.        std::cout << std::endl;
    9. }
    10. int main()
    11. {
    12.        Def_num(5,6,7);
    13.        Def_num(5,6);
    14.        Def_num(5);
    15.        //Def_num(5, , 7);语法错误,跨越传参
    16.        //Def_num(,6,7);同理
    17.        return 0;
    18. }

     

    61ee578c7e704d719052b191df4dc1b0.png

     

    tips:若是运行任意一个错误项,就会有以下警报。

     

    43cfab8161414db49c58e4b2d2a63afb.png

     


     

    🍉杂谈浅解

     

    附:缺省参数不能在函数声明与定义中同时出现。为何?

     

    此类情况多发在项目中,将函数声明与函数定义分开的模式,接下来进行模拟。

     

    1. void Simul_num(int val_1, int val_2 = 5);//函数声明
    2. void Simul_num(int val_1, int val_2 = 10)//函数定义
    3. {
    4.        std::cout << val_1 + val_2 << std::endl;
    5. }

     

    函数声明和函数定义同时定义缺省值会引发很多不必要的麻烦。

     

    如代码处:在函数声明中val_2缺省值被定义为:5,函数定义中val_2缺省值也被定义为:10。

     

    如此多变,函数该使用谁的缺省值呢?

     

    答案是:谁都不会使用。

     

    或许会有人质疑,如果缺省值都定成一样的数值,会不会有所改变呢?

     

    其实,对于函数调用来说,它会更以函数声明作为权威的参考值,但函数定义也有一定的影响性。所以一旦出现两方重复定义就会产生分歧,最后造成参数的重定义!

     

    df91e7a6de35452b8768de55eaa53b87.png

     

    小结:在进行缺省值定义时,要在函数声明中定义。(声明定义不分离,在类中定义成内联函数)

     

    tips:缺省参数定义最好使用常量。

     


     

    🍉函数重载

     

    函数重载是指:可以定义多个函数名相同的函数体,通过函数参数列表中形参的区分,而达到调用同一函数名,就可实现不同的函数定义。

     

    函数重载的意义:减少函数的命名复杂性,减少命名污染,方便使用。

     

    1. void Defau_Fun(int tege, double doub)//重载函数1
    2. {
    3.        std::cout << "重载函数一:" << tege + doub << std::endl;
    4. }
    5. void Defau_Fun(double doub, int tege)//重载函数2
    6. {
    7.        std::cout << "重载函数二:" << tege + doub << std::endl;
    8. }
    9. int main()
    10. {
    11.        Defau_Fun(3, 2.21);
    12.        Defau_Fun(2.1, 50);
    13.        return 0;
    14. }

     

    aa12c233a82144daa5dfdff4d5b2aca3.png

     

    小结:初步来看,函数重载的作用在于能够调用同一函数名而实现不同的函数功能,弥补了C语言函数名不能相同的困扰,而其核心在于C++对函数名的识别规则,参数列表是此功能得以实现的重器。

     

    以下展开详谈。

     


     

    🍉函数重载实现原则

     

    1、同名函数的声明必须所属在同一个作用域。

     

    tips:都在全局或局部(正确),定义在不同命名空间或类中(错误)。

     

    2、函数形参列表要做到:参数个数不同、类型不同、顺序不同。

     

    若出现两个或多个参数列表相同函数,则重载函数都不调用,发生歧义。

     

    例:

     

    (1)、个数不同

     

    1. void Defau_Fun(int tege)//个数不同
    2. {
    3.        std::cout << tege << std::endl;
    4. }
    5. void Defau_Fun(double tege, double fafb)//个数不同
    6. {
    7.        std::cout << tege + fafb << std::endl;
    8. }

     

    (2)、类型不同

     

    1. void Defau_Fun(int tege, int fafb)//类型不同
    2. {
    3.        std::cout << tege + fafb << std::endl;
    4. }
    5. void Defau_Fun(double tege, double fafb)//类型不同
    6. {
    7.        std::cout << tege + fafb << std::endl;
    8. }

     

    (3)、顺序不同

     

    1. void Defau_Fun(int tege, double fafb)//顺序不同
    2. {
    3.        std::cout << tege + fafb << std::endl;
    4. }
    5. void Defau_Fun(double fafb, int tege)//顺序不同
    6. {
    7.        std::cout << tege + fafb << std::endl;
    8. }

     

     

    tips:若参数符合重载规则,但函数返回值不同,也无法构成重载,原因是函数无法进行区分。

     

    小结:最核心的使用思想就是注意区分参数,通过传参调控,进入你所想使用的函数中。

     

    附:重载函数的应用范围十分广泛,就好比上文提到的:输入/输出的自动类型识别。

     


     

    文章到这就结束啦!如果喜欢就关注Duoni叭!

     

  • 相关阅读:
    抖音直播招聘报白企业人力资源公司多渠道展示职位
    Flink CDC入门实践--基于 Flink CDC 构建 MySQL 和 Postgres 的 Streaming ETL
    Windows编译yolov5_obb的nms_rotated模块报错解决
    C陷阱与缺陷 第3章 语义“陷阱” 3.3 作为参数的数组声明
    【刷题篇】动态规划(三)
    un7.27:redis数据库常用命令。
    MQ系列8:数据存储,消息队列的高可用保障
    Springboot中的@Import注解~
    并行化优化KD树算法:使用C#实现高效的最近邻搜索
    根据模板和git commit自动生成日·周·月·季报
  • 原文地址:https://blog.csdn.net/Duoni_7/article/details/126088653