переменные класса c ++ и конструкция по умолчанию

0
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 должен иметь конструктор по умолчанию?

Теги:

1 ответ

3
Лучший ответ

Причина этого в том, что вы не инициализируете 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) {}
  • 0
    Хорошо, правда, но ClassA все еще заканчивает тем, что строит два ClassB: один по умолчанию, затем не по умолчанию, верно?
  • 0
    @MadisonBrown Нет, как я уже сказал, больше не требуется, чтобы ClassB больше ClassB умолчанию. Только один ClassB создан.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню