类类型的“无默认构造函数”

时间:2017-02-25 04:40:24

标签: c++ c++11 constructor

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

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

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

...

这意味着类类型可以包含:

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

默认构造函数。

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

2 个答案:

答案 0 :(得分:2)

  

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

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

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

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

答案 1 :(得分:0)

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

  

简单来说,如果构造函数可以在没有参数的情况下调用,则它是默认的。如果构造函数不是由用户提供但是声明/定义,则构造函数是隐式的(声明/定义)。

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

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