C++中的类与对象模型
一,C/C++内存模型
1.内存模型分类
- 栈区:由编译器自动分配和释放,用来存放函数的参数,局部变量。存放在栈中的数据只在当前函数及下一层函数中有效,函数一旦结束,这些数据就被释放了。
- 堆区:由程序员分配和释放,如果程序员没有释放则在程序结束时由OS释放,由于忘记释放通常会出现内存泄露问题。
- 全局(静态)区:用来存储全局变量和静态变量,程序结束时由OS释放。
- 常量区:存放字面量,不允许修改,如字符串"Hello,Unreal",程序结束时由OS释放。
- 代码区:存放代码(如函数),不允许修改(类似常量区),但可以执行(不同于常量区)。
2.理解函数,代码和内存分配的问题
函数是由一条条的操作指令(代码)组合而成的,其指令可以是定义变量向内存申请空间,或者是操作指令,例如两数相加。
二,C++中类和对象的内存分配模型
1.C++中类和对象
在C语言中,“数据”和“函数”是分开来声明的,也就是说,语言并没有支持“语言和函数”之间的关联性。但是在C++中却提供了“类”来将“数据”和“函数”绑定在了一起。C++中的类由成员变量,静态成员变量,构造函数,成员函数,静态函数和虚函数组成。下面我们来研究组成类的数据和函数是如何在内存中分配的。
2.C++中是如何管理类和对象的
我们首先来定义几个类,然后对下面的代码进行分析。
# include<iostream>
using namespace std;
/* 定义第一个类:12个字节 */
class C1
{
private:
int a;//
int b;//
int c;//
};
/* 定义第二个类:12个字节 */
class C2
{
private:
int a;//
int b;//
int c;//
static int d;//
};
/* 定义第三个类:4个字节 */
class C3
{
private:
int a;//
static int b;//
public:
void setA(int a)//
{
this->a = a;
}
int getA()//
{
return this->a;
}
static void add()//
{
C3::b += ;
}
};
/* 定义结构体:4个字节 */
struct S1
{
int a;
static int b;
}; int main()
{
cout << "C1类所占字节数:" << sizeof(C1) << endl;
cout << "C2类所占字节数:" << sizeof(C2) << endl;
cout << "C3类所占字节数:" << sizeof(C3) << endl;
cout << "S1结构体所占字节数:" << sizeof(S1) << endl; return ;
}
3.上述代码结果分析
- C++中的成员变量和成员函数是分开存储的。
- 普通的成员变量存放在对象(变量)中,与结构体变量有相同的内存布局和字节对齐方式。
- 静态成员变量存储在全局(静态)区。
- 成员函数和静态函数存储在代码区。
4.C++成员变量存放在对象中,那么成员函数是如何管理的?
5.上述代码总结
- C++的类是用结构体实现的,因此类中的成员变量和结构体里的变量内存布局方式一致。
- C++类中的成员函数隐式包含一个指向当前对象的指针,哪个对象调用该函数,C++编译器就默认将该对象包含在函数中。
- 静态成员变量和静态成员函数属于类,因此静态成员函数不包含指向具体对象的指针。
6.this指针
- 通过上述示例,我们发现类中的普通成员函数包含一个this指针,该指针指向调用当前函数的对象,即谁调用我,我就指向谁。
- this指针通常用于在成员函数或者构造函数的形参和成员变量一致的时候,用this指针来表示当前对象的成员变量,形参直接赋值给成员变量即可。
C++中的类与对象模型的更多相关文章
- C++中的类继承(4)继承种类之单继承&多继承&菱形继承
单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或以上直接父类时称这个继承关系为多继承.这种继承方式使一个子类可 ...
- C++中的类继承之单继承&多继承&菱形继承
C++中的类继承之单继承&多继承&菱形继承 单继承是一般的单一继承,一个子类只 有一个直接父类时称这个继承关系为单继承.这种关系比较简单是一对一的关系: 多继承是指 一个子类有两个或 ...
- 《python解释器源码剖析》第13章--python虚拟机中的类机制
13.0 序 这一章我们就来看看python中类是怎么实现的,我们知道C不是一个面向对象语言,而python却是一个面向对象的语言,那么在python的底层,是如何使用C来支持python实现面向对象 ...
- Python中的类、对象、继承
类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...
- 基础知识(05) -- Java中的类
Java中的类 1.类的概念 2.类中的封装 3.对象的三大特征 4.对象状态 5.类与类之间的关系 ------------------------------------------------- ...
- Objective-C中的类目,延展,协议
Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
- Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法
Android中View类OnClickListener和DialogInterface类OnClickListener冲突解决办法 如下面所示,同时导入这两个,会提示其中一个与另一个产生冲突. 1i ...
- C#中timer类的用法
C#中timer类的用法 关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类 ...
随机推荐
- 利用Attribute实现Aop
Aop“面向切面编程”,与OOP“面向对象编程”一样是一种编程思路.个人理解:在不改变原有逻辑的基础上,注入其他行为. 基础代码(仿MVC拦截器实现) namespace HGL.Toolkit.Ao ...
- C语言深度剖析-----数组与指针分析
数组的本质: 指针的运算: 小标VS指针: a和&a的区别: 例: 数组参数: 所以下例返回4 指针和数组的对比小结:
- stm32的ADC左右对齐
- ASP.NET配置文件里经常使用到的节点信息
web.config文件是一个XML文件,是以<confirguration>为根结点展开的. 上一面从宏观上解说了一下有关配置的文件的内容,以下是一些有关于配置文件经常使用的操作. ...
- Oracle性能分析12:对象统计信息
对象统计信息描写叙述数据是如何在数据库中存储的,查询优化器使用这些统计信息来做出正确的决定.Oracle中有三种类型的对象统计信息:表统计.列统计和索引统计.而在每种类型中,有细分为:表或索引级别的统 ...
- ARM+linux学习过程(2)安装vmware-tool过程与错误解决
安装: 点击Ubuntu VMware菜单的-VM-Install VMware Tools 这时,在Ubuntu下会自动加载Linux版的VMware Tools的安装光盘镜像.你会看到虚拟机的桌面 ...
- UILabel调整字间距
1.引入 在文件导入 #import <CoreText/CoreText.h> 2.程序 NSMutableAttributedString *attributedString =[[N ...
- boost::asio的http client应用笔记
1 踩过的坑 1.1 io_service boost::asio::io_service::run()会一直运行到没有任务为止,假设中途调用stop().则全部等待中的任务会立马运行.要在停止的时候 ...
- 前端js实现打印(导出)excel表格
产品原型: 图片.png 功能需求:点击导出考勤表格按钮,会自动下载成Excel格式 图片.png 图片.png jsp页面代码: <div class="tools"> ...
- HTML5移动开发实战必备知识——本地存储(1)
本地缓存是HTML5出现的新技术,这个技术的出现使得移动web的开发成为了可能.我们都知道.要想打造一个高性能的移动应用,速度是关键.而在HTML5之前.仅仅有cookie可以存储数据,大小仅仅有4k ...