C++对象模型,其实就是C++中的对象在内存中是如何排布的。
C++中的对象包含了成员变量和成员函数,其实就是研究C++中的类对象它的成员变量和成员函数在内存中是如何排布的。

回归本质
class 是一种特殊的struct(之所以特殊,是因为它们的默认访问级别不一样)
-在内存中class依旧可以看作变量的集合
-class与struct遵循相同的内存对齐规则
-class中的成员函数与成员变量是分开存放的
  每个对象有独立的成员变量 (存在的位置可能是栈空间、堆空间、全局数据区)
  所有对象共享类中的成员函数(只可能存放在代码段)

实验一:

#include<iostream>
#include <string> using namespace std; class A
{
int i;
int j;
char c;
double d; }; struct B
{
int i;
int j;
char c;
double d;
}; int main()
{
cout << "sizeof(A)=" << sizeof(A) << endl; //20bytes
cout << "sizeof(B)=" << sizeof(B) << endl; //20bytes return ;
}

实验二:

在class A中,给它加上一个成员函数print,此时再看类A所占的内存大小。

class A
{
int i;
int j;
char c;
double d;
public:
void print()
{
cout << "i=" << i << ","
<< "j=" << j << ","
<< "c=" << c << ","
<< "d=" << d << "," << endl;
} };

打印结果还是20个bytes,说明了:

一个C++对象代表的仅仅是成员变量的集合,

实验三:

#include<iostream>
#include <string> using namespace std; class A
{
int i;
int j;
char c;
double d;
public:
void print()
{
cout << "i=" << i << ","
<< "j=" << j << ","
<< "c=" << c << ","
<< "d=" << d << "," << endl;
} }; struct B
{
int i;
int j;
char c;
double d;
}; int main()
{
A a;
cout << "sizeof(A)=" << sizeof(A) << endl;
cout << "sizeof(a)=" << sizeof(a) << endl;
cout << "sizeof(B)=" << sizeof(B) << endl; a.print(); // B* p = &a; 因为B和a的类型不同,需要进行强制类型转换。使用reinterpret_cast关键字,为什么使用这个关键字呢?
//需要重新解释a对象所代表的这段内存。
B* p = reinterpret_cast<B*>(&a); //此时将a对象当成一个结构体B的变量来使用
p->i = ;
p->j = ;
p->c = 'C';
p->d = ; a.print();
return ;
}

该实验说明,一个对象本质上就是一个特殊的结构体变量

运行时的对象退化为结构体的形式
-所有成员变量在内存中依次排布
-成员变量间可能存在内存空隙
-可以通过内存地址直接访问成员变量
-访问权限关键字在运行时失效

比如说private成员不能在类的外部被访问,这一点仅仅是在编译的时候有效,也就是说在写完代码之后,编译器在进行语法检查的时候访问权限关键字会起作用,但是一旦编译通过,C++面向对象程序将变成二进制可执行程序,在这个时候就没有访问权限关键字的概念了。可以使用指针,使用内存地址直接修改成员变量的值。通过上述实验三,就可以做到。

最新文章

  1. 偏移:translate ,旋转:rotate,缩放 scale,不知道什么东东:lineCap 实例
  2. 关于分页接口设计(下拉刷新上拉加载原理,解决page count请求重复数据的问题)
  3. background的css 排列顺序写法?
  4. Android自定义View
  5. Java 程序优化:字符串操作、基本运算方法等优化策略(二)
  6. C#基础总结之二循环控制-运算符
  7. 初试cocos2d-x坐标系
  8. CC150 - 11.5
  9. JAVA基础知识之网络编程——-关于阻塞IO/非阻塞IO/同步IO/异步IO的一些参考文章
  10. hiho 第116周,最大流最小割定理,求最小割集S,T
  11. Bootstrap日期和时间表单组件运用兼容ie8
  12. Codeforces Round #140 (Div. 2)
  13. C#.Net 图片处理大全
  14. eclipse设置自定义快捷键
  15. 【转】 Android Studio SVN 使用方法
  16. OkHttp基本使用
  17. win7下 mysql安装(mysql-5.7.18-winx64.zip)
  18. 【并发编程】ThreadPoolExecutor参数详解
  19. Python的易错点
  20. C++中的指针,指针函数和函数指针

热门文章

  1. 使用VS Code开发纸壳CMS自动编译主题压缩CSS,JS
  2. fuse3 编译相关简要记录 与 fuse3 系统调优;
  3. 好用的性能检测工具-性能监控工具- Glances
  4. A Neural Influence Diffusion Model for Social Recommendation 笔记
  5. Cpp 二叉树
  6. 利器: Mac自带的图片工具Sips
  7. 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 5
  8. gcc 编译安装
  9. sed命令:删除匹配行和替换
  10. Oracle - v$lock查询慢原因分析