本质

class是一种特殊的struct

在内存中class依旧可以看作变量的集合

class与struct遵循相同的内存对齐规则

class中的成员函数与成员变量是分开存放的

每个对象有独立的成员变量

所有对象共享类中的成员函数

例1:

#include <iostream>

#include <string>
using namespace std;
class A
{
    int i;
    int j;
    char c;
    double d;
    public:
    void printf()
    {
        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;
    a.printf();
    B* p = reinterpret_cast<B*>(&a);
    p->i = 100;
    p->j = 220;
    p->c = 'C';
    p->d = 3.14;
      a.printf();
    return 0;
}

输出:

sizeof(a)=20
sizeof(A)=20
sizeof(B)=20
i = 134515168,j = -1079784728,c = �,d = 4.85968e-270
i = 1,j = 2,c = c,d = 3
delphi@delphi-vm:~$ 
delphi@delphi-vm:~$ g++ test.cpp
delphi@delphi-vm:~$ ./a.out
sizeof(a)=20
sizeof(A)=20
sizeof(B)=20
i = 134515168,j = -1078963720,c = �,d = 4.85968e-270
i = 100,j = 220,c = C,d = 3.14

C++对象模型分析

运行时的对象退化为结构体的形式

所有成员变量在内存中依次排布

成员变量间可能存在内存空隙

可以通过内存地址直接访问成员变量

访问权限关键字在运行时失效

类中的成员函数位于代码断中

调用成员函数对象地址作为参数隐式传递

成员函数通过对象地址访问成员变量

C++语法规则隐藏了对象地址的传递过程

小结:

Slide8.PNG


YingLi
6 声望4 粉丝

From zero to hero.