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),也就是首址+成员变量的偏移量,合成得到成员变量的地址。

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

时间: 2024-11-09 10:10:43

C++对象模型:成员变量<一>非静态成员的相关文章

Java构造方法、成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的?

[Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构造方法. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减): ① 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次: ② 父类优先于子类进行初始化: ③ 按照成员变量定义顺序进行初始化,即使变量定义散布于方法

在c++中,静态数据成员可以被非静态成员函数调用吗?如果可以调用的话那为什么还要定义静态成员函数呢

静态数据成员可以被非静态成员函数访问.但静态成员函数只能访问静态数据成员.静态数据成员从属于某一个类,而不是某一个类的 对象.同理,静态成员函数也是一样. 追问 定义静态成员函数的作用有何在呢 回答 静态成员函数隶属于类,不用实例化对象,就可以直接调用静态成员函数来操作静态数据成员 提问者评价 太给力了,你的回答完美解决了我的问题!

回调函数中调用类中的非静态成员变量或非静态成员函数

有关这方面的问题,首先说一点: 回调函数必须是静态成员函数或者全局函数来实现回调函数,大概原因是普通的C++成员函数都隐含了一个函数参数,即this指针,C++通过传递this指针给成员函数从而实现函数可以访问类的特定对象的数据成员.由于this指针的原因,使得一个普通成员函数作为回调函数时就会因为隐含的this指针问题使得函数参数个数不匹配,从而导致回调函数编译失败. 基于上面的理论,如何在类中封装回调函数呢? 回调函数只能是全局函数或者静态成员函数,但是由于全局函数会破坏封装性,所以只能用静

JAVA非静态成员变量之死循环

1.非静态成员变量 当成员变量为非静态成员变量且对当前类进行实例化时,将会产生死循环 例子: public class ConstructorCls { private ConstructorCls obj=new ConstructorCls(); } public class TestC { public static void main(String[] args) { ConstructorCls c =new ConstructorCls(); } } 结果: Exception in

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

静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的 member可能都没有分配内存.静态成员函数没有隐含的this自变量.所以,它就无法访问自己类的非静态成员 代码如下: class a{public:  static FunctionA()  {     menber = 1;  } private:  int menber;} 编译上述代码,出错.原因很简单大家都知道,静态成员函数不能访问非静态成员,这是因为静态函数属于类而不是属于整个对象,静态函数中的

C++静态成员函数不能调用非静态成员变量

其实我们从直观上可以很好的理解静态成员函数不能调用非静态成员变量这句话 因为无论是静态成员函数还是静态成员变量,它们都是在类的范畴之类的,及在 类的整个生存周期里始终只能存在一份.然而非静态成员变量和非静态成员函数 是针对类的对象而言. 然而从本质上来说类的静态成员函数的函数形参中没有默认的this指针,导致不能 调用具体实例对象的成员. 下面我们来测试一下: 先在静态成员函数中调用静态成员变量: 1 #include <iostream> 2 using namespace std; 3 4

java 成员变量 静态成员变量 方法 静态方法初始化顺序

Java构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [Java笔试真题]:构造方法.成员变量初始化以及静态成员变量初始化三者的先后顺序是什么样的? [解答]:当类第一次被加载的时候,静态变量会首先初始化,接着编译器会把实例变量初始化为默认值,然后执行构造方法. Java程序的初始化一般遵循以下三个原则(以下三原则优先级依次递减): ① 静态对象(变量)优先于非静态对象(变量)初始化,其中,静态对象(变量)只初始化一次,而非静态对象(变量)可能会初始化多次: ② 父类

python的静态成员变量、实例成员变量、静态方法、类方法、实例方法

静态成员变量(类变量)和普通成员变量(实例变量) 静态成员变量只能通过类名.变量名获得,实例成员变量,通过该实例引用.变量名获得. 在实例对静态成员变量赋值时,实例 python是动态类型的语言,没有特别的标志区分静态成员变量和普通成员变量 如果你使用类名.成员变量    那这个成员变量现在就是静态成员变量(类变量) 如果你使用实例.成员变量    那这个成员变量现在就是普通成员变量(实例变量) 静态方法.类方法.实例方法      实例方法,类中的普通方法,由实例调用 类方法,被@classm

.Net中的静态类和非静态类、静态成员和非静态成员

正如标题,这样的资料网上很多,也说的很到位,但是都感觉解释的很多,理论性过强,在这里我简单的总结和概括下他们之间的区别,可以一目了然: 一.静态类和非静态类 Definition: 静态类可以视为类库中都是单一的过程,不存在“状态”的概念: 非静态类是存储有状态的一类操作过程 Summary: 非静态类可以包含静态方法: 静态类只能包含静态方法(不允许有非静态方法的存在) 二.静态方法和非静态方法(实例方法) Priority in Memory When Class Loaded: 类在加载时