2013-07-09 51 views
1

所以我知道在类中编写构造函数后,默认构造函数会消失,因此您必须开始初始化每个对象。但是,有没有办法编写一个默认的构造函数,以便您不必这样做?如何在C++中编写一个默认的构造函数?

谢谢。

+6

'= dafault' .... –

+4

@LuchianGrigore *'default' – zch

+0

什么'dafault'我刚读?!? – Casey

回答

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; 
} 
2

隐含的默认构造函数消失。你仍然可以编写另一个默认的构造函数,一个不带任何参数或只带有缺省值的参数;这只是编译器没有为你做的。

没有理由不能为类A写一个空的构造函数,并采用每个值的默认值。也许不是最好的主意,但它可以做到。

A() {/* empty */} 

正如评论指出的,如果你正在使用C++ 11你也可以使用新的default keyword给你什么,如果它做的“默认”

A() = default; 
7

编译器将有前C++ 11

class MyClass 
{ 
public: 
    MyClass(int x, int y) {} 
    MyClass() {} 
}; 

或C++ 11

class MyClass 
{ 
public: 
    MyClass(int x, int y) {} 
    MyClass() = default; 
}; 

你可以根据自己的喜好编写尽可能多的构造函数,但是避免让你的类感到困惑。

+0

+1后记建议。 –

1
struct S { 
    S(int) {} // non-default constructor that suppresses the implicit default constructor 

    S() = default; // bring the default constructor back 
}; 

请注意,有两种使用“默认”的意义。从某种意义上说,它有一个默认的构造函数,它具有一个签名,以便在“默认构造”中使用它。

其次,在默认情况下,实现将与编译器为隐式声明的构造函数自动生成的内容匹配。

通过给出构造函数的默认参数,可以使您的类缺省构造(第一种意义上的缺省构造)。

struct S { 
    S(int = 10) {} 
}; 

虽然= default用来明确要求默认实现(默认的第二个含义)。

假设你的编译器实现了= default,使用它通常优于S() {},原因很多。类定义中的= default会生成一个非用户提供的构造函数,它具有多个效果。

  • 用户提供的特殊成员函数从未琐碎
  • 用户提供的构造不够格从一种聚合一种类型。
  • 值初始化包括零初始化类型与非用户提供的默认构造函数
  • 默认const对象的初始化是不允许的类型,而用户提供的默认构造函数

偶尔有人可能会想由于这些效果之一而由用户提供的功能。它仍然可以通过使用它的类定义之外使用= default

struct S { 
    S(); 
}; 

S::S() = default; 

以上提供的编译器的默认实现,但仍算作用户提供的默认构造函数。另外,这可以用来保持ABI的稳定性;在后面的点= default可以被替换为另一个定义,而不需要重新编译构造对象的所有代码,而使用内联默认构造函数时将需要该对象。