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++面向对象程序将变成二进制可执行程序,在这个时候就没有访问权限关键字的概念了。可以使用指针,使用内存地址直接修改成员变量的值。通过上述实验三,就可以做到。

第50 课C++对象模型分析——成员变量(上)的更多相关文章

  1. 第50 课C++对象模型分析——成员函数(上)

    类中的成员函数位于代码段中调用成员函数时对象地址作为参数隐式传递成员函数通过对象地址访问成员变量C++语法规则隐藏了对象地址的传递过程 #include<iostream> #includ ...

  2. 第50课 C++对象模型分析(上)

    1. 回归本质 (1)class是一种特殊的结构体 ①在内存中class依旧可以看作变量的集合 ②class与struct遵循相同的内存对齐规则 ③class中的成员函数与成员变量是分开存放的.即每个 ...

  3. 第51课 C++对象模型分析(下)

    1. 单继承对象模型 (1)单一继承 [编程实验]继承对象模型初探 #include <iostream> using namespace std; class Demo { protec ...

  4. C++对象模型:成员变量<一>非静态成员变量

    非静态成员变量,分别两种可能,要么类自定义,要么继承而来.根据<深度探索C++对象模型>的解读. class X { private: int x,y,z; }; 在这个类中,有三个私有成 ...

  5. Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用

    1. 反射获取成员变量并且使用: (1)获取字节码文件对象:         Class c = Class.forName("cn.itcast_01.Person"); (2) ...

  6. SpringMVC处理Date类型的成员变量方法

    原文链接:http://www.tuicool.com/articles/aYfaqa 在使用 SpringMVC 的时候,我们可能需要将一个对象从 View 传递给 Controller .而当这个 ...

  7. 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

    继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...

  8. 第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)

    1.当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 单个对象 单个对象创建时构造函数的调用顺序 a.调用父类的构造函数 b.调用成员变量的构造函数(调用顺序与声明顺序相同) c.调用类自身的 ...

  9. Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用

    在perference 加content Assist 可以设置快捷键 透视图与视图 透视图:Debug和java主窗口 视图:每一个小窗口就是视图 高版本的java可运行低版本的java版本 常见的 ...

随机推荐

  1. RF自动化测试之元素封装

    自动化测试均需要遵循由点到面的规则,然而对于UI自动化,点是最容易发生变化的,如果使用硬链接,那么每次元素的修改都必须修改代码,这对于代码功底薄弱的测试工程师来说,是较为困难的,所以自动化测试需要对底 ...

  2. QT使用LIBS添加绝对路径的dll引用

    http://blog.sina.com.cn/s/blog_70b93da90100n6w8.html 参考这篇文章 举例: 要引用 F:\QT\parttime_work\build-JChart ...

  3. HTML网页自动跳转(重定向)

    HTML网页自动跳转(重定向) meta <head> <meta http-equiv="refresh" content="5;url=https: ...

  4. Python gc

    Python gc Python gc 模块提供垃圾回收器的接口 关于 Python 垃圾回收 <- 点击查看 官方文档:https://docs.python.org/3/library/gc ...

  5. WPF DATAGrid 空白列 后台绑定列 处理

    原文:WPF DATAGrid 空白列 后台绑定列 处理 AutoGenerateColumns <DataGrid x:Name="dataGrid" Margin=&qu ...

  6. 利用OD破解一个简单的C语言程序

    最近在学习汇编(看的是王爽老师的<汇编语言(第三版)>),然后想尝试使用OD(Ollydbg)软件破解一个简单的C语言程序练练手. 环境: C语言编译环境:VC++6.0 系统:在Wind ...

  7. Jenkins—Master/Slave模式

    Jenkins可部署在windows或者linux平台上,项目系统的用户多数为windows系统.如果Jenkins部署在linux上,而自动化任务要在windows平台执行,那么就需要使用Jenki ...

  8. Jenkins登录后空白页

    进入.jenkins所在的目录 编辑config.xml文件 重启jenkins

  9. Python 如何操作微信

    1.给文件传输助手发一条消息 import itchat itchat.auto_login(enableCmdQR=True) # 这里需要你人工手机扫码登录 itchat.send('Hello, ...

  10. WPF DataGrid显示MySQL查询信息,且可删除、修改、插入 (原发布 csdn 2018-10-13 20:07:28)

    1.入行好几年了,工作中使用数据库几率很小(传统行业).借着十一假期回家机会,学习下数据库. 2.初次了解数据库相关知识,如果本文有误,还望告知. 3.本文主要目的,记录下wpf界面显示数据库信息,且 ...