C++对象模型:成员变量<一>非静态成员

Posted YuRi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++对象模型:成员变量<一>非静态成员相关的知识,希望对你有一定的参考价值。

非静态成员变量,分别两种可能,要么类自定义,要么继承而来。根据《深度探索C++对象模型》的解读。

class X
{
    private:
    int x,y,z;
};

在这个类中,有三个私有成员变量(不管私有,保护,或公有),都按照某个次序排列(一般根据定义的先后顺序),唯一需要注意的是:某些变量需要对齐填充。在内存中的排列次序依次为:x,y,z;
假如需要对这三个变量进行操作,实际会在成员函数中填充一个指针,参照《深入浅出MFC》。

class X
{
    public:
    void f()/*此处填充,得到:void f((X*)this)*/
    {
        x++;/*等价于this->x++;*/
    }
    private:
    int x,y,z;
};

那么,如何得到成员变量x的地址呢?采用:对象首址+offset(x),也就是首址+成员变量的偏移量,合成得到成员变量的地址。

第二种情况:经过继承得到的成员变量。形式相同,一样的把继承过来的成员变量加到对象的成员变量的内存块中,又会出现次序的问题。书上的解答为:一般情况下,继承的排在前面,派生类排在后面(这个通过程序得到了验证)。

 

以上是关于C++对象模型:成员变量<一>非静态成员的主要内容,如果未能解决你的问题,请参考以下文章

类的静态变量

c++复习篇

关于C++静态成员函数访问非静态成员变量的问题

class中static总结-静态成员函数和静态成员变量

C++ 类中的静态成员变量,静态成员函数

C++ 中static 和final的区别是啥