0

如果没有向构造函数提供任何参数,我该如何做到这一点,以便为变量提供默认值?

例如:

class A { 

A(int x, int y)

}

int main() { 
 A(4);
}

在该示例中,我没有将值传递给 y,我将如何使 y 具有默认值 0,例如,因为没有提供参数?

4

3 回答 3

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}传递的可能性。在允许这些隐式转换之前仔细考虑,直到你知道你想要它们,坚持在构造函数签名之前禁用它们。5Aexplicit

于 2013-05-25T17:53:10.957 回答
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
于 2013-05-25T17:53:29.290 回答
0

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

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

}

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

于 2013-05-25T17:53:31.150 回答