Практически всегда в в примерах кода встречал инициализацию полей класса вне тела конструктора:
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
Комментариев нет:
Отправить комментарий