Ниже я привел пример, чтобы прояснить, что я имею в виду. Здесь класс 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);
}
};
Так ли это? можно ли отключить конструктор по умолчанию для переменной-члена, если он не указан в списке инициализации члена?
Подробнее здесь: https://stackoverflow.com/questions/539 ... uctor-code
Мобильная версия