【问题标题】:C++ constructor with one default parameter and one variable parameter具有一个默认参数和一个可变参数的 C++ 构造函数
【发布时间】:2020-04-02 18:47:46
【问题描述】:

我正在写这个类的构造函数:

element(int f=0, int a)
{
    first = f;
    inc = a;
    current = first - inc;
}

参数被分配给构造函数主体中的成员变量。我被要求在main() 中拨打以下电话:

prog = new element(3,5);
prog = new element(5);

我无法更改(3,5) 的顺序。在构造函数中,f 需要首先传递,a 第二。但是,如果没有传入任何值,f 需要初始化为 0,这样第二次调用将 f 保持为 0,而仅将 a 初始化为 5。

问题在于,如果我在构造函数签名中按此顺序放置参数,则会出现错误。

我该如何解决这个问题?

【问题讨论】:

    标签: c++ class constructor default-arguments


    【解决方案1】:

    此构造函数声明无效:

    element(int f=0, int a)
    {
        first = f;
        inc = a;
        current = first - inc;
    }
    

    如果参数有默认参数,则所有后续参数也必须有默认参数。

    你需要声明两个构造函数,例如:

    element(int f, int a) : first( f ), inc( a )
    {
        current = first - inc;
    }
    
    element(int a) : element( 0, a )
    {
    }
    

    最好将第二个构造函数声明为explicit,以防止从单个整数隐式转换为element 类型:

    explicit element(int a) : element( 0, a )
    {
    }
    

    【讨论】:

    • 这是我最初想要做的,但是这个任务意味着我应该只有一个构造函数。你认为这只是他们的失误吗?
    • @Jad 一个构造函数是不可能的。
    • 感谢您的帮助。
    【解决方案2】:

    您不能将具有默认值的参数放在没有默认值的普通参数之前。因此,您需要重新排序构造函数原型中的参数:

    element(int a, int f=0)
    {
        first = f;
        inc = a;
        current = first - inc;
    }
    

    另一种选择是定义一个重载的构造函数:

    element(int f, int a)
    {
        first = f;
        inc = a;
        current = first - inc;
    }
    
    element(int a)
    {
        first = 0;
        inc = a;
        current = first - inc;
    }
    

    【讨论】:

      【解决方案3】:

      首先,默认参数后面不能有非默认参数。默认参数必须在函数参数列表的最后。见Default arguments

      您可以为构造函数创建重载:

      element(int f, int a)
      {
          first = f;
          inc = a;
          current = first - inc;
      }
      
      element(int a) : element(0,a)
      {
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-18
        • 1970-01-01
        • 2019-06-04
        • 2017-09-27
        • 1970-01-01
        • 2018-04-08
        • 2014-07-09
        • 1970-01-01
        相关资源
        最近更新 更多