在哪些情况下根本没有构造函数,甚至是默认构造函数?

Sam*_*rsa 7 c++ constructor default-constructor

在我正在阅读的这本书中,我遇到了这个:

一个类不需要构造函数.如果对象不需要初始化,则不需要默认构造函数.

我是否正确地从上面推断出编译器在某些情况下不会为类/结构生成默认构造函数?如果是,那些案件是什么?我会冒险说POD可能就是其中之一.还有别的吗?

编辑:我已经更改了标题,因为原始标题给出的含义是我询问何时是未定义的默认构造函数而不是询问何时类没有构造函数.

Dav*_*men 6

一个类不需要构造函数.如果对象不需要初始化,则不需要默认构造函数.

我认为作者正在谈论这种情况:

some_type some_function () {
   POD_type this_is_intentionally_uninitialized;
   ...
}
Run Code Online (Sandbox Code Playgroud)

在某些情况下,不会调用构造函数,句点.一旦编写构造函数,就没有POD类,所以现在将调用构造函数.

让一个包含随机,未初始化数据的对象运行是好还是坏是一个完全不同的问题.

  • @Samaursa:ISO/IEC 14882:2003(E)第8.5节第9段(强调我的):"如果没有为对象指定初始化器,并且该对象是(可能是cv限定的)非POD类类型(或数组)其中,对象应默认初始化;如果对象是const限定类型,则基础类类型应具有用户声明的默认构造函数.**否则,如果没有为非静态对象指定初始化程序,对象及其子对象(如果有)具有不确定的初始值**" (3认同)
  • 嗯,那正是我要问的。您能通过引用(标准或反汇编)来确认您所说的“在某些情况下,不会调用构造函数,句点”。然后,我将其标记为答案(+1) (2认同)

Joh*_*itb 5

始终声明默认构造函数.但它并不总是被定义.只有在使用它时,编译器(或您)才能定义它.例子:

struct A { std::string str; };
// not yet defined

struct B : A { };
// not yet defined

B b; 
// Now B::B and A::A are defined
Run Code Online (Sandbox Code Playgroud)

请注意,这具有直接的实际后果

struct A { private: A(); };
struct B : A { };
// valid, as B::B is not yet defined

B b; 
// now invalid, because B::B is defined and tries to call a 
// private base class constructor
Run Code Online (Sandbox Code Playgroud)