Страницы

Поиск по вопросам

понедельник, 24 декабря 2018 г.

Почему инициализацию полей прописывают вне тела конструктора

Практически всегда в в примерах кода встречал инициализацию полей класса вне тела конструктора:
MyClass(): a(1),b(2),c(3) { }
а не
MyClass() { a = 1; b = 2; c = 3; }
Если оба варианта рабочие, в чем практическая польза от инициализации вне тела конструктора?


Ответ

В первом случае у вас вызываются конструкторы для полей, и тем самым осуществляется инициализация полей..
Во втором случае у вас сначала вызываются конструкторы по умолчанию, и, если инициализаторы полей отсутствуют в их определении, то затем еще вызываются копирующие операторы присваивания, чтобы инициализировать соответствующим образом эти поля, что может быть в конечном итоге очень затратно.
Представьте, например, что в конструкторе динамически выделяется память. Тогда затем в копирующем операторе присваивания эта память будет переопределяться.
Кроме того может так оказаться, что какой-то член данных вообще не имеет конструктора по умолчанию, а только конструкторы с параметрами. В этом случае второй вариант вообще не будет компилироваться.
Рассмотрите простой пример.
Данная программа будет успешно компилироваться
#include
struct A { int x; A( int x ) : x( x ) {} };
struct B { A a; B() : a( 10 ) {} };
int main() { return 0; }
Однако следующая программа компилироваться не будет
#include
struct A { int x; A( int x ) : x( x ) {} };
struct B { A a; B() { a = 10; } };
int main() { return 0; }
так как отсутствует конструктор по умолчанию у класса A, который должен быть вызван до передачи управления управления в тело конструктора B

Комментариев нет:

Отправить комментарий