当前类没有默认构造函数,但成员对象有默认构造函数(整理自深度探索C++对象模型 的41页)

当前类没有默认构造函数,但成员对象有默认构造函数

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;
}
上一篇:41. 缺失的第一个正数 + 哈希表 + 思维


下一篇:力扣-41-环形链表