C++中函数的默认参数问题

我定义了一个三个有默认值参数的函数

int demo1(int a, int b, int c);
int demo1(int a = 1, int b = 2, int c = 3){
    return a+b+c;
};

当我尝试调用并传入两个参数的时候显示编译报错,并且我发现当我不传参数,只传一个,全参调用都没有问题,唯独传入两个的时候会编译报错

demo1();
demo1(1);
demo1(4,3);    //唯独这行编译报错
demo1(6,6,6);

这个是什么原因导致的呢?
而且当我把函数所需的参数提高到4个后

demo1();
demo1(1);
demo1(4,3);      //编译报错
demo1(6,6,6);   //编译报错
demo1(6,6,6,6);

十分不理解,难道对于有默认值的函数,只能是要么全使用要么是只能传入第一个实参吗?

报错信息看一下呢?按说应该只有提供3个参数的会报错,不知道到底匹配哪一个。
你把第3行demo1(4,3)删除的话,就没有报错了?

报错拿出来看看

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/74661
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:数列分段:给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段?(C++)(蛮力法)
  • 除此之外, 这篇博客: 结构体使用方法大全(定义,内存大小,初始化,结构数组,结构指针,位域,结构和联合体的嵌套,结构体包含函数指针)中的 结构体中嵌套结构体,有点像c++中类的继承,应该是使用的比较常见的。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • C语言中的嵌套结构体表示在一个结构体中可以使用另一个结构作为成员。在C语言中定义结构体嵌套有两种方法:

    1. 通过独立的结构
    2. 通过嵌入式结构

    独立结构

    我们可以创建2个结构体,但在主结构中应该使用依赖其它结构体作为成员。我们来看看嵌套结构体的代码。

    struct Date  
    {  
       int dd;  
       int mm;  
       int yyyy;   
    };  
    struct Employee  
    {     
       int id;  
       char name[20];  
       struct Date doj;  // 嵌套一个结构体:Date,用于存储日期
    }emp1;
    

    如上所见,doj(加入日期)是Date类型的变量。 这里doj用作为Employee结构体中的成员。通过这样的方式,我们可以在其他结构体中使用Date结构。

    我们可以在结构体内定义结构体,它比第一种方式需要更少的代码。但它不能用于其它结构中。

    struct Employee  
    {     
       int id;  
       char name[20];  
       struct Date  
        {  
          int dd;  
          int mm;  
          int yyyy;   
        }doj;  
    }emp1;
    

    我们可以通过Outer_Structure.Nested_Structure.member访问嵌套结构的成员,如下所示:

    e1.doj.dd  
    e1.doj.mm  
    e1.doj.yyyy
    C
    

    我们来看看C语言中嵌套结构体的一个简单例子。创建一个源代码文件:nested-structure.c,其代码如下

    #include <stdio.h>  
    #include <string.h>  
    struct Employee
    {
        int id;
        char name[20];
        struct Date
        {
            int dd;
            int mm;
            int yyyy;
        }doj;
    }e1;
    
    int main()
    {
        //storing employee information  
        e1.id = 1001;
        strcpy(e1.name, "Maxsu");//copying string into char array  
        e1.doj.dd = 12;
        e1.doj.mm = 11;
        e1.doj.yyyy = 2018;
    
        //printing first employee information  
        printf("employee id : %d\n", e1.id);
        printf("employee name : %s\n", e1.name);
        printf("employee date of joining (dd/mm/yyyy) : %d/%d/%d\n", e1.doj.dd, e1.doj.mm, e1.doj.yyyy);
        return 0;
    }
    

    执行上面示例代码,得到以下结果 -

    employee id : 1001
    employee name : Maxsu
    employee date of joining (dd/mm/yyyy) : 12/11/2018
    
  • 您还可以看一下 夏曹俊老师的C++ 设计模式原理与实战大全-架构师需备课程课程中的 策略模式的实用工程技术——支付交易系统帐户转帐、数据信令采集中的策略模式实现原理小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    答案:

    问题解答:

    在 C++ 中,默认参数必须从右往左依次设定,默认参数的右侧可以有无限参数,但一旦其中有一个参数设定了默认值,这个参数右侧的所有参数都必须有默认值。建议使用函数重载:

    #include <iostream>
    using namespace std;
    
    int func(int a, int b, int c)
    {
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        cout << "c=" << c << endl;
    
        return 0;
    }
    
    int func(int a, int b)
    {
        int c = 2;  // 定义默认参数
        cout << "a=" << a << endl;
        cout << "b=" << b << endl;
        cout << "c=" << c << endl;
    
        return 0;
    }
    
    int main()
    {
        func(1, 2);  // 输出1, 2, 2
        func(1, 2, 3);  //输出1, 2, 3
        return 0;
    }
    

    具体实现可以下面的代码:

    #include <iostream>
    using namespace std;
    
    int func(int a, int b, int c, int d)
    {
        cout << "4个参数" << endl;
        return 0;
    }
    
    int func(int a, int b, int c)
    {
        cout << "3个参数" << endl;    
        return 0;
    }
    
    int func(int a, int b)
    {
        cout << "2个参数" << endl;    
        return 0;
    }
    
    int main()
    {
        func(1, 2);  //调用2个参数的函数
        func(1, 2, 3);  //调用3个参数的函数    
        func(1, 2, 3, 4);    //调用4个参数的函数
        return 0;
    }