Меня беспокоит конструктор по умолчанию и его список инициализации. В простом случае это понятно, например:
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, который имеет большое количество членов? Или как вообще инициализировать в конструкторе по умолчанию некоторый тип, который имеет большое или неизвестное количество параметров для инициализации?
Вы можете инициализировать 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
}
если у classB большие члены, как вы описали, вы можете нарушить правило дизайна класса — one class does one thing
, Возможно, вы захотите разбить classB на маленькие независимые классы.
Если вы хотите явно инициализировать объект, просто добавьте его в список инициализатора конструктора:
struct Foo
{
Foo(int arg) { ... }
};
struct Bar
{
Foo foo;
Bar()
: foo(123) // Initialize `foo` with an argument
{ ... }
};
Если элемент может быть инициализирован его конструктором по умолчанию, то он даже не должен быть в списке инициализации, потому что конструктор по умолчанию не имеет параметров. Будет вызван конструктор по умолчанию. Примитивы не имеют конструкторов по умолчанию, поэтому они должны быть в списке инициализации, если вы хотите, чтобы они были инициализированы.