文档章节

C++对象内存模型---数据封装

r
 rexlv
发布于 2013/05/05 22:01
字数 429
阅读 418
收藏 4

“C++是C的超集”,这句话里包含了两个问题:

1. C++兼容C;

2. C++在C之上进行了扩展;

那C++在C之上进行了哪些扩展呢?众所周知,C++内置了众多编程机制、支持众多编程风格:面向过程、基于对象、面向对象、面向、基于模板、泛型、元编程等等。其中,以面向过程、基于对象、面向对象的编程机制最为流行。

大家都知道,面向对象有三个基本特征:数据封装与抽象、继承、多态。下面通过分析C++对象内存模型,来剖析C++面向对象的这三个基本特征。

讲到C++的数据封装和抽象,就不得不提类的成员函数和成员数据:

成员数据 非静态对象、静态对象
成员函数 非静态函数、静态函数、虚函数

下面,直接上测试代码,直观的看看C++的基本对象内存模型。

class A{};                             //size: 1
class B{                               //size: 1
    static int mem;
    static void print();
};

class C{                               //size: 4
    int mem;
    void print();
};
class D{                               //size: 8
    char mem;
    static int s_mem;
    virtual void print1(){};
    virtual void print2(){};
};
class E{                               //size: 4
    virtual void print1() = 0;
    virtual void print2() = 0;
};

从测试结果来看,

1. 空类的Size为1,应为编译器自动添加了一个标记字节。(Size为0就太诡异了!)

2. 静态数据和静态函数,配置到对象之外。

3. 非静态函数,配置到对象之外。

4. 含有虚函数的对象,配置有一个指向类虚拟表(vtbl)的指针。

5. 纯虚对象(接口对象),配置有一个指向类虚拟表的指针。

© 著作权归作者所有

共有 人打赏支持
上一篇: 求最大权值路径
下一篇: 求最大权值路径
r
粉丝 0
博文 2
码字总数 621
作品 0
朝阳
私信 提问
为什么我希望用C而不是C++来实现ZeroMQ(第二篇)

译注:这篇文章可能又会引起 C++ 程序员的诸多不适,就作者本文所描述的问题来看,某些“C++的问题”其实是可以有C++的解决方案的。请参阅侵入式和非侵入式容器。但是考虑到ZeroMQ是一个很底...

开心303
2012/09/12
0
2
《深度探索C++对象模型》读书笔记(1)

《深度探索C++对象模型》读书笔记(1)。 在C++中,有两种class data members:static和nonstatic,以及三种class member functions:static、nonstatic和virtual.已知下面这个class Point声...

长平狐
2012/10/08
68
0
精选的这19道C/C+面试题,你能答对多少呢?

软件工程师的面试,套路都差不多,这一次约到的问题,下次你可能还会遇到。 问1:请用简单的语言告诉我C++ 是什么? 答:C++是在C语言的基础上开发的一种面向对象编程语言,应用广泛。C++支持...

悟空_b201
2018/06/02
0
0
有人要我挑战STL 质量, 很简单.

我很多年没有碰C++了, 下面是10年前的代码, 模板来做到数据类型无关, 用于在多个进程当中实现循环链表,用于消息队列. 新的版本,用一个局部对象,来实现锁. 实现这个的目的是在于通过设置固定大...

宏哥
2012/10/12
9.8K
132
详解DC、CDC、HDC、句柄、设备上下文

MFC中的DC、CDC、HDC、句柄、设备上下文究竟是什么意思? 在MFC程序中,我们并不经常直接调用Windows API,而是从MFC类创建对象并调用属于这些对象的成员函数.也就是说MFC封装了Windows API 你...

IMGTN
2012/06/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

移植Modbus到STM32F103(2):移植FreeModbus到usart3并运行示例代码

FreeModbus是Modbus的一个被广泛移植的实现。其源码在github,最新版是1.6。 FreeModbus支持Modbus功能码里的0x01~0x06,0x0F~0x11和0x17,对一些功能比如异常诊断和读事件计数等功能码并没有...

Konstantine
今天
3
0
浅谈神经网络(神经网络篇)

背景 之前写过浅谈神经网络基础篇,简单介绍下机器学习这块内容,用于扫盲。本文正式将神经网络,这部分是深度学习的基础。了解完可以掌握强大的机器学习的方法,也可以更好的了解深度学习。...

Uknowzheng
今天
4
0
移动硬盘变为RAW格式后的修复

在Mac上使用自己的移动硬盘结果文件系统格式变为RAW; 在自己windows笔记本上使用chkdsk H: /F进行修复,修复日志如下: C:\Users\mengzhang6>chkdsk H: /F文件系统的类型是 NTFS。卷标是 do...

晨猫
今天
3
0
10 Git —— 标签管理

10 Git —— 标签管理 本节内容: 命令git tag <tagname>用于新建一个标签,默认为HEAD,也可以指定一个commit id;命令git tag -a <tagname> -m "blablabla..."可以指定标签信息;命令git......

lwenhao
今天
4
0
小程序设置垂直居中,水平居中

如果子容器中的view需要居中的话,那需要在父容器中设置居中 水平居中: display: flex; flex-direction: column; align-items: center; 垂直居中 display: flex;align-items: cen...

淘幻幻
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部