如果没有为构造函数提供参数,如何给变量一个默认值? C ++

时间:2013-05-25 17:51:33

标签: c++ constructor arguments default

如果没有为构造函数提供参数,如何使它变为默认值?

例如:

class A { 

A(int x, int y)

}

int main() { 
 A(4);
}

在那个示例中,我没有将值传递给y,我将如何制作它,因此y的默认值为0,例如因为没有提供参数?

3 个答案:

答案 0 :(得分:4)

使用默认参数,但限制参数只能从右到左读取默认值,因此默认x没有默认y不是一个选项:

A(int x, int y = 0) {}

你的另一个选择就是超载:

A(int x, int y) {}
A(int x) {/*use 0 instead of y*/}

第二种方法可以特别适用于为更复杂的组合委派构造函数:

A(int x, int y) {/*do main work*/}
A(int x) : A(x, 0) {/*this is run after the other constructor*/}

但是,只要您执行上述任何操作,请注意隐式转换到您的班级会更容易。您可以将{6, 10}作为5传递,而不是唯一可能的A。在允许这些隐式转换之前要认真思考,直到您知道自己需要它们为止,在构造函数签名前面加上explicit以禁用它们。

答案 1 :(得分:1)

如果要将默认值传递给参数,可以在构造函数声明中指定它。

class A
{ 
    A(int x, int y = 0)
    {
    }
};

int main()
{ 
    A(4);
}

在声明构造函数的默认参数时要小心。任何可以使用单个参数调用的构造函数都可以在未声明explicit的情况下调用隐式转换。

A(int x = 0, int y = 0) // <-- can invoke implicit conversion
A(int x, int y = 0)     // <-- can invoke implicit conversion
A(int x, int y)         // <-- does NOT implicit conversion

为防止发生隐式转换,请将构造函数声明为explicit

explicit A(int x = 0, int y = 0) // <-- No longer invokes implicit conversion
explicit A(int x, int y = 0)     // <-- No longer invokes conversion
A(int x, int y)                  // <-- does not require explicit keyword

答案 2 :(得分:0)

您必须提供默认变量,以便构造函数变为

A(int x=5, int y=4)

}

y的默认值变为4,x的默认值为5