C ++:具有初始化列表的默认构造函数

C++: default constructor with initialized lists

所以,我问的是关于构造函数的问题,但它适用于编译器提供给 class 的所有成员方法。

我对 default 关键字有点困惑。有什么限制,有什么限制(只有没有参数的Ctor?只有一个默认?) 更具体地说:

    A() = default;

Only one default?

是的。尝试创建两个默认构造函数:

      A() = delete;
      A(int val = 10) : x(val) {}

并且它会立即导致错误:

error: call of overloaded ‘A()’ is ambiguous

Is the only way to use it (for class A) is:
A() = default;

来自cppreference的定义:

A default constructor is a constructor which can be called with no arguments (either defined with an empty parameter list, or with default arguments provided for every parameter).

所以,答案是否定的,你可以编写一个带有多个默认参数的默认构造函数,但它应该在任何上下文中都可以作为 A() 调用,即你应该能够编写 A object;与下面的任何构造函数。以下所有都是有效的默认构造函数:

A() = default;
A(int x = 10) {}
A(int x = 10, int y = 10) {}
A(std::initializer_list<T> list = {}) {}

A object; // will work with any of the constructors above

当然你可以只使用其中一个 class。

Is there any virtue to such a constructor?

这取决于您的需求、您的应用程序、您的设计等等。选择权在你。但就我个人而言,我不会制作一个默认构造函数来接受一个 initializer_list 或多个默认参数,因为它会增加混乱。这里要记住的重要一点是,在我看来,默认构造函数应该非常轻巧,理想情况下应该只是一个空函数调用。这样做的原因是您通常最终会在容器中使用 class,这可能会导致大量默认构造函数调用。如果您的默认构造函数正在做很多事情,那么您将付出性能损失。考虑:

std::vector<A> vec(1000); // results in 1000 calls to default constructor of A

Can I also declare (and not only define) a constructor and make it default?

没有。如果您不为构造函数或任何函数提供定义,则会导致错误,通常类似于 undefined reference to xxx。你仍然可以写成接近你想要的 =default

还要注意以下两个默认构造函数are not the same:

A() = default; //1
A() {} //2
  • 1 是一个简单的默认构造函数。您明确告诉编译器生成一个简单的默认构造函数。
  • 2 是非平凡的用户定义构造函数。