Класс C++ в конструкторе класса по умолчанию

Меня беспокоит конструктор по умолчанию и его список инициализации. В простом случае это понятно, например:

class A
{
  protected:
       double d1;
       //classB obj1; //how to initialize this one in a default constructor?
  public:
       A (double x = 0.0): d1(x){} //constructor
       virtual ~A(void) {};
  //something
}

Но как инициализировать объект класса B, который имеет большое количество членов? Или как вообще инициализировать в конструкторе по умолчанию некоторый тип, который имеет большое или неизвестное количество параметров для инициализации?

3 ответа

Решение

Вы можете инициализировать obj1 в member initializer list вызывая его конструктор по умолчанию или другие конструкторы

class A
{
  protected:
       double d1;
       classB obj1; 
       pthread_mutex_t m_mutex;
  public:
       A (double x = 0.0): d1(x), obj1(), m_mutex(PTHREAD_MUTEX_INITIALIZER) {} 
       virtual ~A(void) {}
       //something
}

если в классе B большие члены, как вы описали, вы можете нарушить правило дизайна класса - one class does one thing, Возможно, вы захотите разбить classB на маленькие независимые классы.

Если вы хотите явно инициализировать объект, просто добавьте его в список инициализатора конструктора:

struct Foo
{
    Foo(int arg) { ... }
};

struct Bar
{
    Foo foo;

    Bar()
        : foo(123)  // Initialize `foo` with an argument
    { ... }
};

Если элемент может быть инициализирован его конструктором по умолчанию, то он даже не должен быть в списке инициализации, потому что конструктор по умолчанию не имеет параметров. Будет вызван конструктор по умолчанию. Примитивы не имеют конструкторов по умолчанию, поэтому они должны быть в списке инициализации, если вы хотите, чтобы они были инициализированы.

Другие вопросы по тегам