如果没有为构造函数提供参数,如何使它变为默认值?
例如:
class A {
A(int x, int y)
}
int main() {
A(4);
}
在那个示例中,我没有将值传递给y,我将如何制作它,因此y的默认值为0,例如因为没有提供参数?
答案 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