【c++深度解析12】 c++对象模型分析

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;    // 20 bytes
    cout << "sizeof(a) = " << sizeof(a) << endl;
    cout << "sizeof(B) = " << sizeof(B) << endl;    // 20 bytes
    
    a.print();
    
    B* p = reinterpret_cast<B*>(&a); // 为嘛可以强制转换
    
    p->i = 1;
    p->j = 2;
    p->c = 'c';
    p->d = 3;
    
    a.print();
    
    p->i = 100;
    p->j = 200;
    p->c = 'C';
    p->d = 3.14;
    
    a.print();   // 为嘛修改了类中的私有成员变量
    
    return 0;
}
 

通过上面代码发现  通过指针p 成功修改了对象a的私有成员变量。 说明访问权限关键字在运行时失效了

由上面代码获得如下结论:

运行时的对象退化为了结构体的形式 (可以强制转换通过)

所有成员变量在内存中一次排布 (通过结构体指针直接修改所指向对象的成员变量)

成员变量间可能存在内存空隙  (sizeof的大小和 结构体表现一样,存在内存对齐问题)

可以通过内存地址直接访问成员变量 (通过结构体指针直接修改所指向对象的成员变量)

访问权限关键字在运行时失效  (通过结构体指针直接修改所指向对象的私有成员变量)

猜你喜欢

转载自blog.csdn.net/lvmengzou/article/details/86915361
今日推荐