【问题标题】:"No default constructor" for a class type类类型的“无默认构造函数”
【发布时间】:2017-02-25 04:40:24
【问题描述】:

在 cppreference 上学习 C++ 初始化我发现了以下内容(作为“自 C++11 以来”的值初始化):

1) 如果 T 是没有默认构造函数的类类型,或者具有用户提供或删除的默认构造函数的类类型,则该对象是默认初始化的;

2) 如果 T 是具有既不是用户提供也不是删除的默认构造函数的类类型(也就是说,它可能是具有隐式定义或默认构造函数的类),则该对象为零初始化并且如果它有一个非平凡的默认构造函数,那么它是默认初始化的;

...

这意味着一个类类型可以有:

  • 没有;
  • 用户提供;
  • 已删除;
  • 隐式定义;
  • 默认;

默认构造函数。

“no”默认构造函数是什么意思?类类型不是总是有一个至少隐式定义的(或者它被删除了)吗?

【问题讨论】:

    标签: c++ c++11 constructor


    【解决方案1】:

    “no”默认构造函数是什么意思?类类型不是总是有一个至少隐式定义的(或者它被删除了)吗?

    如果有用户定义的构造函数,则没有隐式定义的默认构造函数(没有参数)。

    最简单的声明方法是使用default 关键字:

    class MyClass {
    public:
        MyClass(int y); // <<< No default constructor generated
        MyClass() = default; // <<< Force generation of default constructor
    };
    

    【讨论】:

      【解决方案2】:

      有关隐式默认值的解释,请参阅此答案:https://stackoverflow.com/a/12340762/3616833

      简单来说,如果可以不带参数调用构造函数,则它是默认的。如果构造函数不是由用户提供而是声明/定义的,则它是隐式的(已声明/定义)。

      如果类的所有构造函数都需要至少一个参数,则仍然可以在没有默认构造函数的情况下声明/定义一个类。

      default 关键字创建一个默认的默认构造函数,因此不是 OP 问题的答案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多