Конструктор по умолчанию - PullRequest
       62

Конструктор по умолчанию

2 голосов
/ 13 сентября 2010
struct Base{
    Base(Base &){}        // suppress default constructor
};

struct Derived : Base{
};

int main(){
    Derived d;
}

Показанный код выдает ошибку, потому что конструктор по умолчанию (неявный) для Base отключен.Действительно, стандарт говорит в $ 12,1 "If there is no user-declared constructor for class X, a default constructor is implicitly declared."

Есть три вещи:

a) Стандарт говорит где-нибудь, что если объявленный пользователем конструктор присутствует в классе, по умолчаниюКонструктор (неявный) подавляется.Это в основном вышеприведенное выражение отрицательно или это еще раз подразумевается:)?

b) Почему это так?

c) Почему те же самые правила не применяются к деструктору по умолчанию?

Ответы [ 3 ]

7 голосов
/ 13 сентября 2010

Я думаю, что а) достаточно ясно подразумевается вашей цитатой.

Что касается «почему» - довольно просто: конструктор по умолчанию не всегда имеет смысл;если бы не было способа подавить его, это существенно ослабило бы C ++.

Что касается c), то класс без деструктора (без «default», просто деструктор) просто не имеет смысла.

1 голос
/ 13 сентября 2010

а) Стандарт говорит где-нибудь, что если пользователь объявил конструктор присутствует в классе, по умолчанию Конструктор (неявный) подавляется. Это в основном сказанное выше отрицательно или это еще раз подразумевается :)

Да, это значение

b) Why is it that way?

Скорее всего, если у вас есть определяемый пользователем конструктор, это означает, что для инициализации объекта требуется специальная работа. В таком случае имеет смысл отключить неявно сгенерированный конструктор по умолчанию, поскольку он, скорее всего, не будет выполнять какую-либо специальную работу.

c) Why the same rules do not apply for the default destructor?

Что ж, возможно, для языка имеет смысл применять «правило трех» (если вы определяете один из конструктора копирования, оператора присваивания или деструктора, скорее всего, вам нужно реализовать все три), но это просто т.

Возможно, обоснование заключается в том, что существует несколько способов инициализации класса, но назначение и уничтожение часто работают одинаково (присваивание по элементам, запуск деструктора всех членов).

1 голос
/ 13 сентября 2010

Самый короткий ответ: потому что вы объявили конструктор для класса Base, конструктор по умолчанию не создается (таким образом, подавление).Вы не можете инициализировать Derived, потому что Derived не имеет конструктора по умолчанию для вызова в классе Base.(это потому, что конструктор по умолчанию для производного, который сгенерирован для вас, может создать только родительский класс с конструктором по умолчанию)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...