В C ++ любой член класса, который является не , созданным в списке инициализации члена, создается по умолчанию перед выполнением конструктора содержащего класса.Тем не менее, это выглядит очень расточительно, если эта переменная-член просто собирается в любом случае внутри конструктора класса, в котором она находится в .
Я привел пример ниже, чтобы уточнить, что я имею в виду.Здесь класс Example
имеет переменную-член x
типа LargeIntimidatingClass
.Использование списка инициализации члена (первый конструктор в Example
) 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);
}
};
Да, я понимаю, что в этом глупом примере вы могли бы написать Example(string s) : x(f1(s),f2(s)), c(f3(s)) {}
, но яконечно, вы можете себе представить ситуацию, когда вставлять кучу логики в список инициализации члена громоздко (или даже невозможно).
Возможно ли отключить конструктор по умолчанию для переменной-члена, если он не указан в инициализации членасписок