本文内容来自于对狄泰学院 唐佐林老师 C++深度解析 课程的学习总结
回归本质
class 是一种特殊的 struct
在内存中class 依旧可以看作变量的集合
class 与 struct 遵循相同的内存对齐规则
class 中的成员函数 与 成员变量 是分开存放的
- 每个对象有 独立的 成员变量
- 所有对象 共享 类中的成员函数
值得思考的问题
运行结果
实验结果:同样元素的类和结构体,所占内存空间大小一样
C++ 对象模型分析
运行时 的对象 退化为结构体 的形式
所有 成员变量 内存中 依次排布
成员变量间 可能存在内存空隙
可以 通过内存地址 直接访问成员变量
访问权限关键字在运行时失效
类中的 成员函数 位于 代码段 中
调用成员函数时 对象地址作为参数隐式传递
成员函数 通过对象地址访问成员变量
C++ 语法规则隐藏了对象地址的传递过程
实验编程
为了说明 C++ 语法规则隐藏了对象地址的传递过程,我们来编写一个C程序,来模拟对象的创建,成员函数调用,对象销毁。
Demo.h
#ifndef _DEMO_H_
#define _DEMO_H_
typedef void Demo;
Demo *Demo_Creat(int i, int j);
int Demo_GetI(Demo *pthis);
int Demo_GetJ(Demo *pthis);
void Demo_Free(Demo *pthis);
#endif
Demo.c
#include <stdio.h>
#include <malloc.h>
#include "Demo.h"
struct DemoClass
{
int m_i;
int m_j;
};
Demo* Demo_Creat(int i, int j)
{
struct DemoClass *pthis = (struct DemoClass *)malloc(sizeof(struct DemoClass));
if(pthis == NULL)
return NULL;
pthis->m_i = i;
pthis->m_j = j;
return pthis;
}
int Demo_GetI(Demo *pthis)
{
struct DemoClass *demo = (struct DemoClass *)pthis;
return demo->m_i;
}
int Demo_GetJ(Demo *pthis)
{
struct DemoClass *demo = (struct DemoClass *)pthis;
return demo->m_j;
}
void Demo_Free(Demo *pthis)
{
free(pthis);
}
main.c
#include <stdio.h>
#include "Demo.h"
int main(void)
{
Demo *classdemo = Demo_Creat(1, 2);
int i = Demo_GetI(classdemo);
int j = Demo_GetJ(classdemo);
printf("i = %d\n", i);
printf("j = %d\n", j);
Demo_Free(classdemo);
return 0;
}
运行结果:
实验现象:C 语言在模拟对象调用成员函数的过程中需要传递对象的指针,而 C++ 在语言上隐藏了这一操作
小结
C++ 中的类对象在 内存布局上与结构全相同
成员变量 和 成员函数 在内存中分开存放
访问权限 关键字在 运行时失效
调用成员函数时对象地址作为参数隐式传递