具有一个默认参数和一个变量参数的C ++构造函数

问题描述 投票:0回答:3

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

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++
3个回答
4
投票

构造函数的此声明

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(int a) : element( 0, a )
    {
    }

以防止从整数到类型元素的隐式转换。


0
投票

首先,默认参数之后不能有非默认参数。默认参数应该是函数参数列表中的最后一个。参见:https://en.cppreference.com/w/cpp/language/default_arguments

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

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

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

}

0
投票

您不能在默认参数之前包含默认值的参数。因此,您需要在函数/构造函数原型中对参数进行重新排序

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;
    }
© www.soinside.com 2019 - 2024. All rights reserved.