Отключить инициализацию члена класса по умолчанию перед кодом конструктора.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Отключить инициализацию члена класса по умолчанию перед кодом конструктора.

Сообщение Anonymous »

В C++ любой член класса, который не создан в списке инициализации членов, создается по умолчанию до выполнения конструктора содержащего его класса. Однако это выглядит очень расточительно, если эта переменная-член все равно будет создана внутри конструктора класса, в котором она находится.

Ниже я привел пример, чтобы прояснить, что я имею в виду. Здесь класс Sample имеет переменную-член x типа LargeIntimidatingClass. При использовании списка инициализации членов (первый конструктор в примере) x создается только один раз. Однако, если x невозможно разумно сконструировать с использованием списка инициализации членов, он создается дважды!

Код: Выделить всё

//This class used as part of the example class further below
class LargeIntimidatingClass {
// ...
//many member variables and functions
// ...

LargeIntimidatingClass() {
//Painfully expensive default initializer
}

LargeIntimidatingClass(int a, double b) {
//Complicated calculations involving a and b
}
};

//Here, this class has a LargeIntimidatingClass as a member variable.
class Example {
LargeIntimidatingClass x;
char c;

//Basic member initialization list constructor. Efficient!
Example(int a, double b, char c) : x(a,b), c(c) {}

//What if the parameters to the LargeIntimidatingClass's constructor
//need to be computed inside the Example's constructor beforehand?
Example(std::string sophisticatedArgument) {
//Oh no! x has already been default initialized (unnecessarily!)

int a = something1(sophisticatedArgument);
double b = something2(sophisticatedArgument);
//x gets constructed again! Previous (default) x is totally wasted!
x = LargeIntimidatingClass(a,b);

c = something3(sophisticatedArgument);
}
};
Да, я понимаю, что в этом глупом примере вы могли бы написать Пример(строка s) : x(f1(s),f2(s)), c(f3(s)) {}, но я уверен, что вы можете представить ситуацию, когда запихивание кучу логики в список инициализации членов является обременительным (или даже невозможным).

Так ли это? можно ли отключить конструктор по умолчанию для переменной-члена, если он не указан в списке инициализации члена?

Подробнее здесь: https://stackoverflow.com/questions/539 ... uctor-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»