+------> Implicitly GENERATED by compiler
|
|
Default Constructor -----+
|
|
+------> Explicitly provided by programmer
По сути, ctor по умолчанию - это ctor без аргументов.
ОБРАТИТЕ ВНИМАНИЕ, что компилятор не будет генерировать ctor по умолчанию в следующем случае:
class WontGenerateDefCtoByCompiler
{
private:
char* iHaHaPtr;
};
Причина, по которой компилятор не видит необходимости инициализировать указатель, предоставляемый программистом. Программист обязан правильно написать и инициализировать ctor по умолчанию.
Если вы, с другой стороны, напишите виртуальную функцию внутри вышеуказанного класса, компилятор определенно сгенерирует ctor по умолчанию (но не инициализирует указатель iHahaptr для вас). Кроме того, такой ctor будет сгенерирован ТОЛЬКО ЕСЛИ экземпляр этого объекта был создан в программе (иначе, опять же, ctor не будет сгенерирован компилятором).
Это ТОЛЬКО 4 условия, при которых компилятор НЕПРАВИЛЬНО генерирует ctor по умолчанию (если это не предусмотрено программистом):
(1) The class has a virtual function (Why? need to setup vptr correctly )
(2) The class is derived from another class that has default ctor (either implicitly generated or explictly provided)
(3) The class has a member that has default ctor (either implicitly generated or explictly provided)
(4) The class is virtually derived from other class
Во всех остальных случаях компилятор не будет генерировать ctor по умолчанию.