2.5构造函数语义续(编译器什么时候会帮我们生成默认构造函数) 笔记

一.父类带缺省构造函数,子类没有任何构造函数时

看一段代码:

class Parent
{
public:
	Parent()
	{
		cout << "Parent" << endl;
	}
};

class Child :public Parent
{
public:

};

int main()
{
    Child ch;
    return 0;
}

打开vs开发人员命令提示符切换到main.obj所在目录,执行

dumpbin /all main.obj > parse.txt

然后我们能在parse.txt里面看到编译器确实帮我们生成了默认构造函数

 

 会帮我们生成的原因:

那因为父类这个缺省的构造函数要被调用,所以编译器会为这个子类合成出一个默认构造函数。合成的目的是为了调用这个父类的构造函数。换句话说,编译器合成了默认的构造函数,并在其中安插代码,调用其父类的缺省构造函数。

二.如果一个类含有虚函数,但没有任何构造函数时

看一段代码:

class VTest
{
public:
	virtual void vPrint()
	{

	}
	void func()
	{

	}
};

int main()
{
    VTest test;
    return 0;
}

更新parse.txt文件,在parse.txt中也发现了构造函数:

生成原因:

因为虚函数的存在,
    a)编译器会给我们生成一个基于该类的虚函数表vftable。
    b)编译给我们合成了一个构造函数,并且在其中安插代码: 把类的虚函数表地址赋给类对象的虚函数表指针 (赋值语句/代码);

 三.在继承中存在虚继承的

如下面代码:

class A
{
public:
};
class B :virtual public A
{
public:
};

int main()
{
    B b;
    return 0;
}

再次执行那条指令后,可以在parse.txt中看到

原因:以为虚基类表的存在.

四.编译器在为我们生成默认构造函数的时候都帮我们做了什么

一般都做了以下事情
    (a)生成了类MBTX的虚函数表
    (b)调用了父类的构造函数
    (c)因为虚函数的存在,把类的虚函数表地址赋给对象的虚函数表指针。

    视情况而定,不是只要为我们生成就一定abc都做.比如没有虚函数就不会生成虚函数表.
    当我们有自己的默认构造函数时,编译器会根据需要扩充我们自己写的构造函数代码,比如调用父类构造函数,给对象的虚函数表指针赋值。
    编译器干了很多事,没默认构造函数时必要情况下帮助我们合成默认构造函数,如果我们有默认构造函数,编译器会根据需要扩充默认构造函数里边的代码。

五.总结

以下4.种情况编译器会帮我们生成默认构造函数

1.类TestB没有任何构造函数,但包含一个类类型的成员testA,而该对象testA所属于的类TestA有一个缺省的构造函数时

2.父类带缺省构造函数,子类没有任何构造函数时

3.如果一个类含有虚函数,但没有任何构造函数时

4.在继承中存在虚继承的

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值