当前类没有默认构造函数,但成员对象有默认构造函数
class Foo
{
public:
Foo();//default constructor
Foo(int);
...
};
class Bar//自己没有默认构造函数,但其成员对象foo有默认构造函数.
{
public:
Foo foo;//这个时候Bar::foo需要被初始化
private:
int n;
};
//此时编译器会自动为Bar合成一个默认构造函数(不可见)
Bar::Bar()
{
//伪代码,会调用Foo的默认构造函数
foo.Foo::Foo();
}
//若用户自己给成员对象Bar::n进行初始化.则编译器会将默认构造函数扩张成 #1 那样.
Bar::Bar()
{
n = 0;
}
//#1
Bar::Bar()
{
//伪代码
foo.Foo::Foo();
n = 0;
}
推广开来,若Bar有多个有默认构造函数的成员对象,则编译器会自动在Bar的默认构造函数中调用成员对象的默认构造函数.调用顺序取决于成员对象声明的顺序.
class Demo
{
public:
Demo();
Demo(int);
...
};
class Bar
{
public:
Foo foo;
Demo demo;
//...
private:
int n;
};
//用户自己写如下默认ctor
Bar::Bar(): demo(10) //注意此处demo(10)是调用的它的构造函数
{
n = 0;
}
//编译器会做如下的扩张
Bar::Bar(): demo(10) //注意此处demo(10)是调用的它的构造函数
{
//伪代码 调用成员对象的构造函数
foo.Foo::Foo();
demo.Demo::Demo(10);
n = 0;
}