vs调试技巧:
- F5调试
- F9加断点
- shift+F9 :查看变量内存地址
1. 对象
1.1 sizeof(空类)== 1
1.2 类的成员函数不占用 类对象 的内存空间
1.3 静态成员变量属于类,不占用 类对象 的内存空间
1.4 虚函数
虚函数表一般是保存在可执行文件中的,在程序执行的时候载入到内存中来
1.5 this指针调整
结果:
结论:调用哪个子类的成员函数,这个this指针就会自动调整到子类对象内存布局中去
1.6 分析obj文件
“合成的默认构造函数”,只有在必要的时候,编译器才会为我们合成出来
- 验证:
- 生成解决方案后,执行如下命令生成查看 obj 文件内容
- 试图搜索 A 的构造函数发现没有
- 何时编译器会生成默认构造函数?
- 一个类中没有任何构造函数,但含有类类型成员变量,该类类型成员变量所属的类中有一个缺省的构造函数
- 父类带缺省构造函数,子类没有任何构造函数
在“合成的默认构造函数”中调用父类的构造函数。
- 一个类含有虚函数,但没有任何构造函数
在“合成的默认构造函数”中:
- 生成类的虚函数表
- 把类的虚函数表地址赋值给虚函数表指针
- 虚继承
编译器为子类和父类都产生了“合成的默认构造函数”
1.7
“合成的拷贝构造函数”,在必要的时候才会被编译器合成出来
-
验证
-
何时编译器会生成默认拷贝构造函数?
- 一个类中没有拷贝构造函数,但含有类类型成员变量,该类类型成员变量所属的类中有一个拷贝构造函数;
当代码中有涉及到类的拷贝构造时,编译器就会为该类合成一个拷贝构造函数
- 父类带拷贝构造函数,子类没有
当代码中有涉及到类的拷贝构造时,编译器就会为该类合成一个拷贝构造函数
- 一个类没有拷贝构造函数,但是该类声明或者继承了虚函数
当代码中有涉及到类的拷贝构造时,编译器就会为该类合成一个拷贝构造函数
- 虚继承
- 总结
“合成的默认构造函数” | 一个类中没有任何构造函数,但含有类类型成员变量,该类类型成员变量所属的类中有一个缺省的构造函数 | 父类带缺省构造函数,子类没有任何构造函数 | 一个类含有虚函数,但没有任何构造函数 | 虚继承 |
---|---|---|---|---|
“合成的拷贝构造函数” | 一个类中没有拷贝构造函数,但含有类类型成员变量,该类类型成员变量所属的类中有一个拷贝构造函数 | 父类带拷贝构造函数,子类没有 | 一个类没有拷贝构造函数,但是该类声明或者继承了虚函数 | 虚继承 |