如何在c ++中编写默认构造函数?

时间:2013-07-09 14:59:17

标签: c++ class object constructor

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

感谢。

4 个答案:

答案 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生成一个非用户提供的构造函数,它具有多种效果。

  • 用户提供的特殊成员函数永远不会是微不足道的
  • 用户提供的构造函数取消了将类型视为聚合的资格。
  • 值初始化包括具有非用户提供的默认构造函数的类型的零初始化
  • 对于没有用户提供的默认构造函数的类型,不允许使用const对象的默认初始化

由于其中一种影响,有时人们可能需要用户提供的功能。在类定义之外使用它仍然可以使用= 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;
}