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

C++ constructor with one default parameter and one variable parameter

我正在写这个 class 构造函数:

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。

这个问题是,如果我将参数按此顺序放在构造函数签名中,我会收到错误消息。

我该如何解决这个问题?

此构造函数声明无效:

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 )
{
}

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

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

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

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

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

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;
}