如果没有向构造函数提供任何参数,我该如何做到这一点,以便为变量提供默认值?
例如:
class A {
A(int x, int y)
}
int main() {
A(4);
}
在该示例中,我没有将值传递给 y,我将如何使 y 具有默认值 0,例如,因为没有提供参数?
如果没有向构造函数提供任何参数,我该如何做到这一点,以便为变量提供默认值?
例如:
class A {
A(int x, int y)
}
int main() {
A(4);
}
在该示例中,我没有将值传递给 y,我将如何使 y 具有默认值 0,例如,因为没有提供参数?
使用默认参数,限制参数只能从右到左读取默认值,因此默认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
如果要将默认值传递给参数,可以在构造函数声明中指定它。
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
您必须提供默认变量,以便构造函数变为
A(int x=5, int y=4)
}
y 的默认值变为 4,x 的默认值为 5