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

亚尼夫·G

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

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

  • (对于A类)使用它的唯一方法是:
    A() = default;
  • 是否可以将具有初始化程序列表的构造函数定义为“默认”?

  • 这样的构造函数有什么优点吗?如果有的话,正确的语法是什么?

  • 我还可以定义(并且不仅声明)构造函数并将其设置为默认值吗?

      class A
      {
      public:
          A() = delete;
          A(int val) : x(val) {} // how to make it default?;
      private:
          int x;
      };
    
      int main()
      {
          A a(2);
      }
    
瓦卡尔

只有一个默认值?

是。尝试制作两个默认的构造函数:

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

它将立即导致错误:

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

(对于A类)使用它的唯一方法是:
A() = default;

来自cppreference的定义

默认构造函数是可以不带参数调用的构造函数(可以使用空参数列表或为每个参数提供的默认参数来定义)。

因此,答案是否定的,您可以编写带有多个默认参数的默认构造函数,但是它可以像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

当然,您只能在课程中使用其中之一。

这样的构造函数有什么优点吗?

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

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

我还可以声明(并且不仅定义)构造函数并将其设置为默认值吗?

否。如果不为构造函数或任何函数提供定义,则将导致错误,通常会类似undefined reference to xxx您仍然可以编写=default接近所需内容的内容。

另请注意,以下两个默认构造函数不相同

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++初始化字段直接与默认构造函数中的初始化列表

来自分类Dev

具有复杂分配的C ++构造函数初始化器列表

来自分类Dev

C ++初始化程序列表成员仍在调用默认构造函数?

来自分类Dev

没有默认构造函数的成员对象的 C++ 初始化:

来自分类Dev

C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

来自分类Dev

错误C2512:没有合适的默认构造函数-为什么在构造函数中初始化属性?

来自分类Dev

C ++ 11使可变参数构造函数了解初始化列表的初始化列表

来自分类Dev

C ++:构造函数按初始化列表的顺序

来自分类Dev

C ++初始化构造函数初始化器列表中的模板数组

来自分类Dev

C ++构造函数:在初始化列表之前初始化局部变量

来自分类Dev

C ++没有匹配的构造函数的[]初始化

来自分类Dev

没有构造函数的C ++零初始化

来自分类Dev

C ++ 11:默认的默认构造函数可以导致部分初始化的类吗?

来自分类Dev

具有复杂参数的初始化列表C ++

来自分类Dev

c++ 继承(无基构造函数)没有初始化列表(低于 c++ 11)?

来自分类Dev

依赖项没有复制构造函数或赋值运算符时的 C++ 初始化器列表

来自分类Dev

C ++默认构造函数未初始化指向nullptr的指针?

来自分类Dev

C++ 默认成员初始化和构造函数

来自分类Dev

C ++ 11统一初始化:初始化列表和多参数构造函数之间的歧义?

来自分类Dev

为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

来自分类Dev

具有支撑初始化列表的已删除构造函数的默认构造

来自分类Dev

C ++构造函数初始化列表中的C struct副本

来自分类Dev

在构造函数的初始化列表中将c-style-sting转换为std :: string

来自分类Dev

C ++在初始化列表之外显式调用父构造函数

来自分类Dev

C ++使用其他参数获取构造函数的初始化程序列表

来自分类Dev

C ++:使用RAII解决构造函数初始化程序列表依赖项

来自分类Dev

使用初始化列表时检查传递给构造函数的参数-C ++

来自分类Dev

C ++入门说我们可以对“ = default”构造函数使用初始化列表

来自分类Dev

为什么C ++列表初始化也要考虑常规构造函数?

Related 相关文章

  1. 1

    C ++初始化字段直接与默认构造函数中的初始化列表

  2. 2

    具有复杂分配的C ++构造函数初始化器列表

  3. 3

    C ++初始化程序列表成员仍在调用默认构造函数?

  4. 4

    没有默认构造函数的成员对象的 C++ 初始化:

  5. 5

    C ++中的初始化程序列表和类初始化。我有无参数构造函数,但仍必须使用初始化列表?

  6. 6

    错误C2512:没有合适的默认构造函数-为什么在构造函数中初始化属性?

  7. 7

    C ++ 11使可变参数构造函数了解初始化列表的初始化列表

  8. 8

    C ++:构造函数按初始化列表的顺序

  9. 9

    C ++初始化构造函数初始化器列表中的模板数组

  10. 10

    C ++构造函数:在初始化列表之前初始化局部变量

  11. 11

    C ++没有匹配的构造函数的[]初始化

  12. 12

    没有构造函数的C ++零初始化

  13. 13

    C ++ 11:默认的默认构造函数可以导致部分初始化的类吗?

  14. 14

    具有复杂参数的初始化列表C ++

  15. 15

    c++ 继承(无基构造函数)没有初始化列表(低于 c++ 11)?

  16. 16

    依赖项没有复制构造函数或赋值运算符时的 C++ 初始化器列表

  17. 17

    C ++默认构造函数未初始化指向nullptr的指针?

  18. 18

    C++ 默认成员初始化和构造函数

  19. 19

    C ++ 11统一初始化:初始化列表和多参数构造函数之间的歧义?

  20. 20

    为什么显式声明的构造函数阻止使用C ++ 11初始化列表进行成员初始化?

  21. 21

    具有支撑初始化列表的已删除构造函数的默认构造

  22. 22

    C ++构造函数初始化列表中的C struct副本

  23. 23

    在构造函数的初始化列表中将c-style-sting转换为std :: string

  24. 24

    C ++在初始化列表之外显式调用父构造函数

  25. 25

    C ++使用其他参数获取构造函数的初始化程序列表

  26. 26

    C ++:使用RAII解决构造函数初始化程序列表依赖项

  27. 27

    使用初始化列表时检查传递给构造函数的参数-C ++

  28. 28

    C ++入门说我们可以对“ = default”构造函数使用初始化列表

  29. 29

    为什么C ++列表初始化也要考虑常规构造函数?

热门标签

归档