(C++对象模型):分析obj目标文件,构造函数语义(上)

目录

默认构造函数

介绍在windows下怎么看obj文件

编译器会在哪些必要的时候帮助我们把默认的构造函数合成出来呢?

增加类对象进行测试

调换MATX与MCTX顺序,再次测试


默认构造函数

  • 默认构造函数(缺省构造函数):没有参数的构造函数
    • 传统认识认为:如果我们自己没定义任何构造函数,那么编译器就会为我们隐式自动定义 一个默认的构造函数,我们称这种构造函数为:“合成的默认构造函数
  • 结论:“合成的默认构造函数”,只有在 必要的时候,编译器才会为我们合成出来,而不是必然或者必须为我们合成出来
  • 必要的时候 是什么时候?
  • 每个 .cpp 源文件会编译生成一个 .obj(.o) linux 下 gcc -c ,最终把很多的 .obj(.o) 文件链接到一起生成一个可执行。

介绍在windows下怎么看obj文件

  • 源文件
#include <iostream>
using namespace std;

class MBTX
{
public:
	int m_i;
	int m_j;

	void funct()
	{
		cout << "IAmVeryGood" << endl;
	}
};

int main()
{
	MBTX myb;
	return 1;
}
  • 生成解决方法

  • 文件右击,打开所在文件夹

  • 进入Debug目录,找到同名的扩展名为.obj文件

  • 找到VS开发人员命令行提示符

  • 进入 .obj 文件所在路径

  • 用dumpbin把.obj文件内容导出成可查看文件my.txt,这个my.txt格式,一般被认为是COFF:通用对象文件格式(Common Object File Format);
  • 拖至VS2019中打开
dumpbin /all project100.obj > my.txt

  • 下面查看系统有没有合成默认构造函数 ,MBTX::MBTX
  • Ctrl + F查找,结果如下

  • 编译器并没有合成构造函数,这种情况不是 必要的时候。

编译器会在哪些必要的时候帮助我们把默认的构造函数合成出来呢?

  • 该类MBTX没有任何构造函数,但包含一个类类型的成员ma,而该对象ma所属于的类MATX 有一个缺省的构造函数
  • 这个时候,编译器就会为该类MBTX生成一个 “合成默认的构造函数”,合成的目的是为了调用MATX里的默认构造函数。
  • 换句话说:编译器合成了默认的MBTX构造函数,并且在其中 安插代码,调用MATX的缺省构造函数
#include <iostream>
using namespace std;

class MATX
{
public:
	MATX() //默认构造函数
	{
		cout << "YYYYY" << endl;
	}
};

class MBTX
{
public:
	int m_i;
	int m_j;
	MATX ma;  //类类型成员变量

	void funct()
	{
		cout << "IAmVeryGood" << endl;
	}
};

int main()
{
	MBTX myb;   //输出YYYYY
	return 1;
}
  • 使用dumpbin工具(参照前面流程)

增加类对象进行测试

#include <iostream>
using namespace std;

class MCTX
{
public:
	MCTX() //默认构造函数
	{
		cout << "CCCCC" << endl;
	}
};

class MATX
{
public:
	MATX() //默认构造函数
	{
		cout << "YYYYY" << endl;
	}
};

class MBTX
{
public:
	int m_i;
	int m_j;
	MATX ma;  //类类型成员变量
	MCTX mc;  //类类型成员变量

	void funct()
	{
		cout << "IAmVeryGood" << endl;
	}
};

int main()
{
	MBTX myb;  //输出YYYYY  CCCCC
	return 1;  
}
  • 使用dumpbin工具测试:

调换MATX与MCTX顺序,再次测试

  • 输出

  • 使用dumpbin工具测试:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值