所以我知道在类中编写构造函数之后,默认构造函数就会消失,所以你必须开始初始化每个对象。但是,有没有办法编写默认构造函数,以便您不必这样做?
感谢。
答案 0 :(得分:7)
在C ++ 11之前
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() {}
};
或在C ++ 11中
class MyClass
{
public:
MyClass(int x, int y) {}
MyClass() = default;
};
您可以根据需要编写尽可能多的构造函数,但避免让您的类混淆使用。
答案 1 :(得分:2)
隐式默认构造函数消失了。您仍然可以编写另一个默认构造函数,一个不接受任何参数的构造函数,或者只接受带有默认值的args;它只是编译器没有为你完成的。
没有理由不能为类A
编写一个空构造函数,并为每个值采用默认值。也许不是最好的主意,但可以做到。
A() {/* empty */}
如评论中所述,如果您使用的是c ++ 11,您还可以使用新的default keyword来提供编译器在执行“默认”时所具有的内容
A() = default;
答案 2 :(得分:1)
struct S {
S(int) {} // non-default constructor that suppresses the implicit default constructor
S() = default; // bring the default constructor back
};
请注意,有两种感觉使用'default'。从某种意义上说,它有一个默认构造函数,它具有一个签名,以便在“默认构造”中使用它。
其次,在某种意义上,“默认”是指实现将与编译器为隐式声明的构造函数自动生成的内容相匹配。
通过给出构造函数默认参数,可以使类默认可构造(在第一种意义上是默认的)。
struct S {
S(int = 10) {}
};
虽然= default
用于明确要求默认实现(默认情况下为第二种意义)。
假设您的编译器实现= default
使用它通常优于执行S() {}
由于多种原因。类定义中的= default
生成一个非用户提供的构造函数,它具有多种效果。
由于其中一种影响,有时人们可能需要用户提供的功能。在类定义之外使用它仍然可以使用= default
:
struct S {
S();
};
S::S() = default;
以上提供了编译器的默认实现,但仍然算作用户提供的默认构造函数。另外,这可以用于维持ABI稳定性;稍后可以用另一个定义替换= default
,而不必重新编译构造S
对象的所有代码,而内联默认构造函数则需要它。
答案 3 :(得分:0)
class A
{
public:
// Or use A()=default for C++11
A(){}
A(int v):m_value(v){}
private:
int m_value;
};
int main()
{
A a; // Without default ctor ==>> error C2512: 'A' : no appropriate default constructor available
return 0;
}