目录
编译器会在哪些必要的时候帮助我们把默认的构造函数合成出来呢?
默认构造函数
- 默认构造函数(缺省构造函数):没有参数的构造函数
- 传统认识认为:如果我们自己没定义任何构造函数,那么编译器就会为我们隐式自动定义 一个默认的构造函数,我们称这种构造函数为:“合成的默认构造函数”
- 结论:“合成的默认构造函数”,只有在 必要的时候,编译器才会为我们合成出来,而不是必然或者必须为我们合成出来。
- 必要的时候 是什么时候?
- 每个 .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工具测试:
(C++对象模型):分析obj目标文件,构造函数语义(上)
最新推荐文章于 2024-01-02 10:55:31 发布