如何用c++编写默认构造函数

How to write a default constructor in c++?

本文关键字:默认 构造函数 何用 c++      更新时间:2023-10-16

所以我知道在类中编写构造函数后,默认的构造函数就会消失,所以你必须开始初始化每个对象。然而,有没有一种方法可以编写一个默认的构造函数,这样你就不必这么做了?

谢谢。

在C++11 之前

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

或在C++11 中

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

您可以编写任意数量的构造函数,但要避免使类的使用变得混乱。

隐式默认构造函数消失。您仍然可以编写另一个默认构造函数,一个不接受任何参数或只接受具有默认值的参数的构造函数;只是编译器没有为您完成。

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

A() {/* empty */}

正如评论中所指出的,如果你使用的是c++11,你也可以使用新的默认关键字来告诉你编译器在使用"默认"时会有什么

A() = default; 
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;
}
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可以替换为另一个定义,而不必重新编译构造S对象的所有代码,而需要使用内联默认构造函数。