• 【C++学习笔记】1.3 缺省参数


    目录

    🍯1.3 缺省参数

    🥝1. 全缺省参数

    🥝2. 半缺省参数

    🥝3. 缺省参数的应用

    🥝4. 缺省参数在声明与定义中的矛盾

    🍯1.3 缺省参数


    缺省参数一共有两种类型:全缺省参数、半缺省参数;它的本质就是当不传参数进入函数时,就用函数定义时所设置的默认参数。


    🥝1. 全缺省参数

    1、有一个缺省参数时

    1. void TestFunc(int a = 0)
    2. {
    3. cout << a << endl;
    4. }
    5. int main()
    6. {
    7. TestFunc(); //没有传参时,使用参数的默认值
    8. TestFunc(1); //传具体参数时,使用传入的参数值
    9. return 0;
    10. }

    当只有一个默认参数时,当我们一个参数都不传递的时候,就使用默认参数;当我们传入了指定参数时,我们就使用指定参数。

    2、有多个缺省参数时

    1. void TestFunc(int a = 10, int b = 20, int c = 30)
    2. {
    3. cout << "a = " << a << endl;
    4. cout << "b = " << b << endl;
    5. cout << "c = " << c << endl;
    6. }
    7. int main()
    8. {
    9. TestFunc(); //没有传参时,使用参数的默认值
    10. TestFunc(1); //传1个参数
    11. TestFunc(1,2); //传2个参数
    12. TestFunc(1,2,3); //传3个参数
    13. return 0;
    14. }

    在包含多个缺省参数时,当我们不传参数时,就使用所有参数的默认值;当我们传1个参数时,就替换函数接收参数中从左开始的第一个参数的默认值。

    例如我们想给a传一个数为1,b和c用默认值时,就可以传一个数过去TestFunc(1);但如果此时我们想给b传一个数2,a和c使用默认值时,我们就不能传TestFunc(2)TestFunc(,2,)了,因为替换操作对于函数参数是从左往右顺序进行的,因此只能传递TestFunc(10,2),将a的默认值也传过去才行。


    🥝2. 半缺省参数

    半缺省并不是缺省一般参数,而是指缺省部分参数,此时至少需要传一个参数,不能一个参数都不传,如果不传参数,此时就会报错。

    void TestFunc(int a, int b = 20, int c = 30) //半缺省c和b,参数a不可缺

    特别需要注意的是,在半缺省中必须要求从右往左连续缺省,即为缺省参数赋值的操作必须从右向左连续:

    1. void TestFunc(int a, int b = 20, int c = 30) // √ 缺省参数c和b从右往左都顺序赋值了
    2. void TestFunc(int a = 10 , int b, int c = 30)// × 缺省参数c和a并不连续,中间夹了不可缺省的b
    3. void TestFunc(int a = 10 , int b = 20, int c)// × 缺省参数b和a并不是从右往左连续,最右的c未被赋值

    🥝3. 缺省参数的应用

    例如我们在进行数据结构中对“栈”进行初始化时,可以使用半缺省的方式对其进行初始空间的定义,当不指定初始化时所开空间的个数,就使用缺省参数的值,n=4进行开辟空间操作。

    1. #include
    2. #include
    3. using namespace std;
    4. typedef struct Stack
    5. {
    6. int* a;
    7. int size;
    8. int capacity;
    9. }Stack;
    10. void StackInit(struct Stack* ps, int n = 4) //初始化若不指定开的空间个数,默认开4个
    11. {
    12. assert(ps);
    13. ps->a = (int*)malloc(sizeof(int) * n);
    14. ps->size = 0;
    15. ps->capacity = 0;
    16. }
    17. int main()
    18. {
    19. Stack st;
    20. StackInit(&st); //全缺省
    21. return 0;
    22. }

    🥝4. 缺省参数在声明与定义中的矛盾

    缺省参数在不能同时在声明和定义中出现,我们可以举个简单的例子来看一看~

    1. //print1.h 中
    2. void print1(int n = 10); //在声明时为默认参数赋值
    3. //print1.cpp 中
    4. void print1(int n = 10) //在定义时也为默认参数赋值
    5. {
    6. cout << n << endl;
    7. }

    通过上述案例可见我们只能在声明或者定义中选一处进行赋值,那么我们到底应该选哪里进行赋值呢?此时共有两种搭配:

    • 声明赋值,定义不赋值(√):这种情况是可以正常运行滴!
      1. void print1(int n = 10); //声明给值
      2. void print1(int n) //定义不给
      3. {
      4. cout << n << endl;
      5. }

    • 定义赋值,声明不赋值(×):这种情况是不能正常运行的,这时因为编译器在进行链接时先找的是声明,如果在声明里没有为缺省参数赋值,那么当不传入参数时print1(),计算机就懵啦!

    Q1:为什么声明和定义不能同时出现?

    A1:因为计算机害怕声明和定义这两个部分对于默认参数的赋值不同,例如在声明时给默认参数赋值int n = 10,在定义时给默认参数赋值int n =20,这时计算机就不知道要听谁的了。

  • 相关阅读:
    MySQL 进阶 怎么去了解MySQL的架构原理
    Linux环境及Linux命令
    每天3分钟,重学ES6-ES12(十五)异步代码处理方案
    【畅所欲言】AI诈骗:防范与应对策略
    【设计模式】Java设计模式 - 模板模式
    【TA】Unity角色二次元风格渲染
    SpringBoot结合JWT+Shiro+Redis实现token无状态登录授权
    java计算机毕业设计网上鲜花店系统源码+数据库+系统+lw文档+mybatis+运行部署
    新课标、新考法,猿辅导创新教育研究院全面拆解新课标
    掘金拉美,大有可为,2023美客多官方招商会-深圳站成功举办!
  • 原文地址:https://blog.csdn.net/qq_54151955/article/details/126041418