何constructor,编译器必须为它合成一个default constructor.
总结 有四种情况,会导致编译器必须为未声明constructor的classes合成一个default constructor‘,C++ Stardard把那些合成物称为implicit nontrivial default constructor。被合成出来的constructor只能满足编译器(而非程序)的需要。它之所以能够完成任务,是借着调用member object或者base class的default constructor或者为每一个object初始化其virtual function机制或virtual base class机制而完成。至于没有存在那四种情况而又没有声明任何constructor的classes,它们拥有的是implicit trivial default constructor,它们实际上并不会被合成出来.
在合成的default constructor中,只有base class subjects和member class objects会被初始化,所有其它的nonstatic data member,如整数,整数指针,整数数据等都不会被初始化,这些初始化操作对程序而言或许需要,但对编译器则并非必要.如果程序需要一个把某指针设为0的default constructor,那么提供它的应该是程序员.
C++新手一般有两个常见的误解:
1. 任何class如果没有定义default constructor,就会被合成出来
2. 编译器合成出来的default constructor会明确设定class 内有每一个data member的默认值
这两个都是错误的.
?
|