我关注的是默认构造函数及其初始化列表。在一个简单的例子中,很明显,例如:
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
}
但是如何初始化classB的对象,它有大量的成员?或者一般如何在默认构造函数中初始化一些具有大量或未知数量的参数进行初始化的类型?
答案 0 :(得分:1)
您可以通过调用默认构造函数或其他构造函数来初始化member initializer list
中的obj1
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分解为小的独立类。
答案 1 :(得分:1)
如果要显式初始化对象,只需将其添加到构造函数初始化列表中:
struct Foo
{
Foo(int arg) { ... }
};
struct Bar
{
Foo foo;
Bar()
: foo(123) // Initialize `foo` with an argument
{ ... }
};
答案 2 :(得分:1)
如果成员可以通过其默认构造函数初始化,那么它甚至不必在初始化列表中,因为默认构造函数没有参数。将调用默认构造函数。基元没有默认构造函数,因此如果要初始化它们,它们必须位于初始化列表中。