C ++ конструктор по умолчанию - PullRequest
9 голосов
/ 29 января 2011

Если мы говорим, что default constructor - это тот конструктор без параметров, можем ли мы также сказать, что конструктор, созданный компилятором, также default constructor?

Спасибо.

Ответы [ 4 ]

17 голосов
/ 29 января 2011

Конструктор по умолчанию - это тот, который можно назвать без аргументов.

C ++ 98 §12.1 / 5 :

A конструктор по умолчанию для класса X является конструктором X, который можно вызывать без аргумента.Если для класса X не объявлен пользователь , объявленный пользователем, для класса *1016*, то конструктор по умолчанию объявляется неявно.

8 голосов
/ 29 января 2011

Конструктор по умолчанию - это конструктор, который может быть и вызываться без аргументов. Так что это либо конструктор без аргументов, либо конструктор, у всех аргументов которого есть значения по умолчанию.

Но да, компилятор генерирует конструктор по умолчанию, если вы не предоставляете никаких других конструкторов.

Рекомендуемое чтение: http://www.parashift.com/c++-faq-lite/ctors.html#faq-10.4.

4 голосов
/ 29 января 2011
                         +------> 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 по умолчанию.

1 голос
/ 29 января 2011

Нельзя просто сказать, что «конструктор, созданный компилятором, также является конструктором по умолчанию».Если конструкторы не объявлены, компилятор создает конструктор по умолчанию и конструктор копирования (и, возможно, конструктор перемещения, если мы говорим здесь о C ++ 0x).Когда вы упоминаете просто «конструктор, созданный компилятором», вы на самом деле говорите как минимум о двух конструкторах одновременно.Таким образом, вы можете только сказать, что «конструктор default , созданный компилятором, также является конструктором по умолчанию», но это звучит как что-то вроде Capt. Очевидный сказал бы.

...