第50 课C++对象模型分析——成员变量(上)
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++对象模型分析——成员变量(上)的更多相关文章
- 第50 课C++对象模型分析——成员函数(上)
类中的成员函数位于代码段中调用成员函数时对象地址作为参数隐式传递成员函数通过对象地址访问成员变量C++语法规则隐藏了对象地址的传递过程 #include<iostream> #includ ...
- 第50课 C++对象模型分析(上)
1. 回归本质 (1)class是一种特殊的结构体 ①在内存中class依旧可以看作变量的集合 ②class与struct遵循相同的内存对齐规则 ③class中的成员函数与成员变量是分开存放的.即每个 ...
- 第51课 C++对象模型分析(下)
1. 单继承对象模型 (1)单一继承 [编程实验]继承对象模型初探 #include <iostream> using namespace std; class Demo { protec ...
- C++对象模型:成员变量<一>非静态成员变量
非静态成员变量,分别两种可能,要么类自定义,要么继承而来.根据<深度探索C++对象模型>的解读. class X { private: int x,y,z; }; 在这个类中,有三个私有成 ...
- Android(java)学习笔记50:通过反射获取成员变量和成员方法并且使用
1. 反射获取成员变量并且使用: (1)获取字节码文件对象: Class c = Class.forName("cn.itcast_01.Person"); (2) ...
- SpringMVC处理Date类型的成员变量方法
原文链接:http://www.tuicool.com/articles/aYfaqa 在使用 SpringMVC 的时候,我们可能需要将一个对象从 View 传递给 Controller .而当这个 ...
- 继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程
继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的 ...
- 第24课.经典问题解析(1.析构函数的顺序;2.const修饰对象;3.成员函数,成员变量是否属于具体对象)
1.当程序中存在多个对象的时候,如何确定这些对象的析构顺序? 单个对象 单个对象创建时构造函数的调用顺序 a.调用父类的构造函数 b.调用成员变量的构造函数(调用顺序与声明顺序相同) c.调用类自身的 ...
- Java基础---基础加强---增强for循环、自动拆装箱及享元、枚举的作用、实现带有构造方法、透彻分析反射的基础_Class类、成员变量的反射、数组参数的成员方法进行反射、数组的反射应用
在perference 加content Assist 可以设置快捷键 透视图与视图 透视图:Debug和java主窗口 视图:每一个小窗口就是视图 高版本的java可运行低版本的java版本 常见的 ...
随机推荐
- Java总结转载,持续更新。。。
1.Java中内存划分 https://www.cnblogs.com/yanglongbo/p/10981680.html
- cf rock is push 【dp】
附上学习的博客:https://blog.csdn.net/u013534123/article/details/102762673 大致题意:一个迷宫,里面有很多箱子,你可以向右或者向下走.当你遇到 ...
- acwing 848 有向图的拓扑序列
地址 https://www.acwing.com/problem/content/description/850/ 题目描述给定一个n个点m条边的有向图,图中可能存在重边和自环. 请输出任意一个该有 ...
- Python连载47-json文件、正则表达式初步
一.在线工具 1.https://www.sojson.com/ 2.http://www.w3cshool.com.cn/json/ 3.http://www.runoob.com/json/jso ...
- js input radio点击事件
html代码: <input type="radio" name="myname" value="1" />1 <inpu ...
- ubuntu 18.04 安装mysql 遇到语言格式不兼容性问题解决
安装mysql的时候,遇到了这样一个错误:perl: warning: Setting locale failed. perl: warning: Please check that your loc ...
- python-15-常用文件操作与注册登录练习
前言 1.常用的文件操作无非就是读或写,但python中没有提供文件修改的功能,是无法实现,但我们可以新增-删除源文件-更改新增文件为源文件名称. 2.使用文件的存储与读取方式来简单完成注册.登录功能 ...
- 拎壶学python3-----(5)pycharm解决运行时少库的问题
有时候我们运行的时候会出现如下现象 no module named requests怎么办呢? 点击设置: 安装成功后会显示如下: 怎么进行安装呢? 然后退出再运行: 发现已经没有缺少requests ...
- (四)初识NumPy(函数和图像的数组表示)
本章节主要介绍NumPy中的三个主要的函数,分别是随机函数.统计函数和梯度函数,以及一个较经典的用数组来表示图像的栗子!,希望大家能有新的收货,共同进步! 一.np.random的随机函数(1) ra ...
- 查看某个进程的错误日志 ps axu 结合 grep -i
某台机器的flume报错,想要快速看到报错的内容,可以结合ps axu 和grep -i来实现. 1. ps axu |grep flume 可以看到flume的进程的启动位置. 2. 根据启动的位置 ...