class ClassB
{
int option;
public:
ClassB(void){} //without the default constructor, the example does not compile.
ClassB(int option)
{
this->option = option;
}
};
class ClassA
{
ClassB objB; //initialize objB using default constructor. When does this actually occur?
public:
ClassA(int option)
{
objB = ClassB(option); //initialize objB again using another constructor.
}
};
int main(void)
{
ClassA objA (2);
return 0;
}
Я новичок в c++ (из С#), и я немного смущен тем, как инициализируются переменные класса. В приведенном выше примере ClassA объявляет объект класса типа ClassB, хранящийся по значению. Для этого ClassB должен иметь конструктор по умолчанию, а это означает, что ClassA сначала создает ClassB с использованием конструктора по умолчанию. Но ClassA никогда не использует этот objB по умолчанию, поскольку он сразу же перезаписывается в конструкторе ClassA.
Итак, мой вопрос: дважды ли инициализирован objB?
Если это так, разве это не лишний шаг? Было бы проще объявить objB как указатель?
Если нет, то почему ClassB должен иметь конструктор по умолчанию?
Причина этого в том, что вы не инициализируете objB
данных objB
, а назначаете его после того, как он был сконструирован по умолчанию.
ClassA(int option)
{
// By the time you get here, objB has already been constructed
// This requires that ClassB be default constructable.
objB = ClassB(option); // this is an assignment, not an initialization
}
Чтобы инициализировать его, используйте список инициализации члена конструктора:
ClassA(int option) : objB(option) {}
Это инициализирует objB
с помощью правого конструктора и не требует, чтобы ClassB
по умолчанию конструктивным. Обратите внимание, что это относится и к ClassB
, конструкторы которого должны быть
ClassB() : option() {} // initializes option with value 0
ClassB(int option) : option(option) {}
ClassB
большеClassB
умолчанию. Только одинClassB
создан.