Cpp 对象模型探索 / 编译器为对象创建缺省构造函数的条件
零、前言
书本上常说,编译器会给没有任何构造函数的类自动创建一个缺省的构造函数(没有形参的构造函数)。但是事实上不是这样么?栗子:
class A
{
public:int i;
};int main()
{A a;return 0;
}
编译上述代码,生成 test1.obj 文件。
这里为了检查编译器是否为我们创建了 a 的构造函数,这里我们使用 “ dumpbin /all test1.obj> test1.txt ” 指令。在 vs2019 的Developer PowerShell 中,输入上述指令,即可在 test1.obj 根目录下生成了 test1.txt 文件,该文件记录了一些汇编信息等。
搜索 “ A::A ” 并没有在 test1.obj 文件中发现该信息,说明编译器并没有为对象 a 创建缺省的构造函数。
通过上述验证,我们发现编译器不是在任何情况下都会为没有建立任何的构造函数的对象创建缺省的构造函数的,只有在必要的情况下才会进行上述操作。
具体的情况如下:
一、成员中存在含有缺省的构造函数的对象。
栗子:
class B
{
public:B() {}
};class A
{
public:int i;B b;
};int main()
{A a;return 0;
}
结果:
……COMDAT; sym= "public: __thiscall A::A(void)" (??0A@@QAE@XZ)……
二、继承了带有缺省的构造函数的类
栗子:
class B
{
public:B() {}
};class A : public B
{
public:int i;
};int main()
{A a;return 0;
}
结果:
……COMDAT; sym= "public: __thiscall A::A(void)" (??0A@@QAE@XZ)……
三、该类中含有虚函数。
栗子:
class A
{
public:int i;
public:virtual void func() {};
};int main()
{A a;return 0;
}
结果:
……COMDAT; sym= "public: __thiscall A::A(void)" (??0A@@QAE@XZ)……
四、该类含有虚基类。
栗子:
class Grand
{;
};
class Father:virtual public Grand
{};
class Uncle:virtual public Grand
{};
class Son:public Father,public Uncle
{
public:int i;
};int main()
{Son sn;return 0;
}
结果:
……COMDAT; sym= "public: __thiscall Father::Father(void)" (??0Father@@QAE@XZ)……COMDAT; sym= "public: __thiscall Uncle::Uncle(void)" (??0Uncle@@QAE@XZ)……COMDAT; sym= "public: __thiscall Son::Son(void)" (??0Son@@QAE@XZ)……
五、类代码中存在变量的初始化(C++11)
class A
{
public:int i = 0;
};int main()
{A a;return 0;
}
结果:
……COMDAT; sym= "public: __thiscall A::A(void)" (??0A@@QAE@XZ)……
(SAW:Game Over!)
Cpp 对象模型探索 / 编译器为对象创建缺省构造函数的条件相关推荐
- Cpp 对象模型探索 / 编译器为对象创建缺省析构函数的条件
1.基类中含有析构函数的子类,编译器为子类创建析构函数. 2.类成员变量是类对象,该类对象含有析构函数,则编译器为子类创建析构函数. 代码 class Parent { public:~Parent( ...
- Cpp 对象模型探索 / 静态局部对象只构造一次的原因和执行析构的方法
代码 class A { public:A() {}~A() {} };void func() {static A a; }int main() {func();return 0; } 问题 1.函数 ...
- Cpp 对象模型探索 / 系列文章的索引
一.对象 普通类对象占用的空间. 子类的内存布局. 编译器为对象创建缺省构造函数的条件. 二.虚函数(完) 对象的虚函数表指针的位置. 继承关系下的虚函数手动调用. 虚函数表和虚函数表指针的创建时机. ...
- Cpp 对象模型探索 / new 对象时加括号和不加括号时的差别
一.结论 CTest *pt1 = new CTest(); CTest* pt2 = new CTest; 1.若类 CTest 是空类,则二者 new 的结果没有区别. 2.若类存在显示声明的缺省 ...
- Cpp 对象模型探索 / 深浅拷贝
2018-04-19 创建人:Ruo_Xiao 开发环境:VS2019 邮箱:xclsoftware@163.com 一.定义 浅拷贝:仅仅是对两个指针变量中的内容进行了赋值,即:两个指针指向的是同一 ...
- Cpp 对象模型探索 / 虚函数表和虚函数表指针的创建时机
一.虚函数表 在编译期间创建.编译器会为每个类确定好虚函数表(vtbl)的内容. 二.虚函数表指针 虚函数表指针跟随着对象,在运行期间创建.由于在编译期间编译器为每个类创建好了 vtbl,并且编译器会 ...
- Cpp 对象模型探索 / 对象访问成员变量的原理
一.栗子 1.源码 #include <iostream> #include <stdio.h>class Base { public:Base() { std::cout & ...
- Cpp 对象模型探索 / 多重继承下基类指针释放子类对象的原理说明(虚析构函数的作用)
源码 #include <iostream>class Base1 { public:virtual void func_1_1(){ std::cout << "B ...
- Cpp 对象模型探索 / 对象的虚函数表指针的位置
一.源码 #include <iostream>class A { public:virtual void func(){};public:int count_ = 0; };int ma ...
最新文章
- es日期format_elasticsearch存储日期格式字段
- 华为路由器RIP协议通信的配置
- 通俗讲解和学习SQL
- 算法与数据结构 -- 排序和查找(五)
- OSI七层-相关协议
- String_boot热部署学习
- 信息学奥赛C++语言:平方值
- Flutter 登录页面Demo 复制可使用
- python随机画圆_python生成随机图形验证码详解
- html表单的课后心得体会,web前端学习心得体会范文
- arcgis怎么压缩tif文件_pdf文件过大怎么办?3种免费压缩PDF的方法
- Code is far away from bug with the animal protecting
- 洛谷T30768 动感超人520
- pandas task-08
- 腾讯历届笔试题(1)
- 【Unity面板属性扫盲】导入纹理后设置Texture Import Settings
- Error in nnet.default(x, y, w, ...) : too many (2651) weights
- PM Q7声卡使用教程
- 如何去掉 APFS 宗卷 • APFS(加密)的加密功能
- Keso眼中的移动互联网罗生门
热门文章
- 4.22、Bootstrap V4自学之路-----内容---轮播
- LINUX下直接使用ISO文件
- Windows系统中让硬盘更快的九大绝招
- 【opencv系列07】OpenCV4.X图像基本操作
- 更新maven一直在更新_不更新app,就可以一直派单了?闪送政策早知道
- Android Studio3.5.2离线安装gradle
- postgresql数据库安装以及使用pgadmin连接postgresql数据库
- Arrays.asList(arr)使用注意事项
- spring boot部署war包打包插件配置
- JDBC的批处理操作