50_C++对象模型分析(上)

0. 回归本质

class是一种特殊的struct,class的默认访问权限是private,struct的默认访问权限是public。

  • 在内存中class依旧可以看作是变量的集合
  • class与struct遵循相同的内存对齐规则
  • class中的成员函数和成员变量是分开存放的, 成员变量存放在栈、堆或者常量区中, 成员函数存放在代码段。

每个对象有独立的成员变量,所有的对象共享类中的成员函数。

编程说明:对象内存布局初探

#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;        // 内存对齐: 20byte
    
    a.print();
    
    B* p = reinterpret_cast<B*>(&a);
    
    p->i = 1;
    p->j = 2;
    p->c = 'a';
    p->d = 3;
    
    a.print();
    
    B& bp = reinterpret_cast<B&>(a);
    
    bp.i = 10;
    bp.j = 20;
    bp.c = 'b';
    bp.d = 4.3;
    
    a.print();
    
    return 0;
}

输出结果:

sizeof(A) = 20
sizeof(a) = 20
sizeof(B) = 20
i = -1219554259, j = -1218018364, c = , d = -8.07148e-42
i = 1, j = 2, c = a, d = 3
i = 10, j = 20, c = b, d = 4.3

1. C++对象模型分析——成员变量分析

运行时的对象退化为结构体的形式:
(1) 所有成员变量在内存中依次排布
(2) 成员变量间可能存在内存间隙(内存对齐)
(3) 可以通过内存地址直接访问成员变量(通过指针或者引用可以直接修改对象中成员变量的值)
(4) 访问权限关键字在运行时失效(访问权限关键字只在编译器有效,在运行期无效)

2. C++对象模型分析——成员函数分析

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

3. C语言实现面向对象【补充】

4. 小结

  • C++中的类对象在内存布局上与结构体相同
  • 成员变量和成员函数在内存中分开存放
  • 访问权限关键字在运行时失效
  • 调用成员函数时对象地址作为参数隐式传递
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 收集非原创文章,如遇原作者,请私聊我,我会表明出处! 1--10 1. C++中什么数据分配在栈或堆,静态存储区以...
    Juinjonn阅读 5,068评论 0赞 30
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,755评论 1赞 51
  • 1. 结构体和共同体的区别。 定义: 结构体struct:把不同类型的数据组合成一个整体,自定义类型。共同体uni...
    breakfy阅读 2,308评论 0赞 22
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 35,258评论 18赞 399
  • 可是,洛神又怎么会放过这种占便宜的机会呢。“我要血月玉镯。”洛神一开口,神君心肝脾肺肾都疼了,早知道话不用说那么满...
    卑辰尊月阅读 319评论 0赞 2

友情链接更多精彩内容