• 【C++】面向对象模型 ① ( 面向对象设计 | 面向对象底层实现机制 | 程序内存结构 )






    一、面向对象模型




    1、面向对象设计


    C++ 语言中 对 面向对象程序设计 的支持有 :

    • 封装 : 封装 静态 / 非静态 成员变量 / 成员函数
    • 继承 : 单继承 , 多继承 , 虚继承 ;
    • 多态 : 函数重载 ;
    • 对象的创建与回收 : 构造函数 , 析构函数 ;

    2、面向对象底层实现机制


    C 语言中 , 数据 ( 变量 ) 和 行为 ( 函数 ) , 是 分开声明 的 , 数据 和 行为 之间 没有 关联性 , C 语言中不支持 数据 和 行为 的 封装 ;

    C++ 语言中 , 可以定义 " 抽象数据类型 " , 在 类 中可以定义 数据 ( 变量 ) 和 行为 ( 函数 ) , 将它们封装在一起 , 实现 数据 和 行为 的 绑定 , 二者是有 关联性 的 ;


    C++ 对象模型 中的成员变量可以是

    • 公有的 : 可以直接被对象访问 ;
    • 私有的 : 只能被对象自身的成员函数访问 ;
    • 受保护的 : 只能被对象自身的成员函数和派生类访问 ;

    C++ 中的 成员变量 有两种类型 :

    • 静态成员变量 : 使用 static 修饰的成员变量 ;
    • 非静态成员变量 : 就是 普通的成员变量 ;

    C++ 中的 成员函数 有 3 种类型 :

    • 静态成员函数 : 使用 static 修饰的 成员函数 ;
    • 非静态成员函数 : 普通的 成员函数 ;
    • 虚函数 : 使用 virtual 修饰的 成员函数 ;

    3、程序内存结构


    计算机实际程序结构 : 从 计算机 程序执行角度分析 , 一个程序由 数据段 和 代码段 组成 ;

    面向对象封装结构 : C++ 中的 面向对象 设计中 , 将 变量 和 函数 封装到一起 ;

    C++ 编译器 需要处理 将 " 面向对象封装结构 " 转为 " 计算机实际程序结构 " 的 工作 ;


    C++ 的 对象模型 描述了 C++ 如何组织和管理程序中的对象 , 包括了

    • 对象的内存布局
    • 成员变量的访问
    • 成员函数的调用
    • 虚函数机制等

    多方面问题 ;


    每个 C++ 类 实例对象 都有其自身的内存空间 , 包括 成员变量 和 成员函数 ;

    成员变量是对象中的数据 , 成员函数是对象中的行为 ;


    4、代码示例 - 对象内存结构测试


    执行下面的代码示例 ,

    所有的类的大小都是 12 字节 , 只有 3 个 int 类型成员变量 是类的大小 ,

    可以看到 类 占用的内存大小 , 只与普通对象有关 , 静态成员变量 和 成员方法 , 都不在对象中定义 ;


    代码示例 :

    #include "iostream"
    using namespace std;
    
    class A
    {
    public:
        int a;
        int b;
        int c;
    };
    
    class B
    {
    public:
        int a;
        int b;
        int c;
        static int s;
    };
    
    class C
    {
    public:
        int a;
        int b;
        int c;
        static int s;
    
    public:
        int fun() { return 4; };
        void fun2() {};
    };
    
    struct D
    {
        int a;
        int b;
        int c;
    };
    
    struct E
    {
        int a;
        int b;
        int c;
        static int s;
    };
    
    int main() {
    
        cout << " sizeof(A) = " << sizeof(A) << endl;
        cout << " sizeof(B) = " << sizeof(B) << endl;
        cout << " sizeof(C) = " << sizeof(C) << endl;
        cout << " sizeof(D) = " << sizeof(D) << endl;
        cout << " sizeof(E) = " << sizeof(E) << endl;
    	
    
        // 控制台暂停 , 按任意键继续向后执行
        system("pause");
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62

    执行结果 :

     sizeof(A) = 12
     sizeof(B) = 12
     sizeof(C) = 12
     sizeof(D) = 12
     sizeof(E) = 12
    请按任意键继续. . .
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

  • 相关阅读:
    session.upload_progress进行文件包含和反序列化学习
    nRF5340(入门篇)之1.1 nrf5340芯片简介
    Real-ESRGAN—图像/视频修复算法
    【Linux】《Linux命令行与shell脚本编程大全 (第4版) 》笔记-Chapter8-管理文件系统
    C++中->与.的区别
    电气间隙与爬电距离
    【学习笔记】AGC028/AGC007
    龙口联合化学通过注册:年营收5.5亿 李秀梅控制92.5%股权
    VLAN聚合(手写版)
    超大规模的产业实用语义分割数据集PSSL与预训练模型开源啦!
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133210850