静态数据成员

来源:互联网 发布:宁波php招聘 编辑:程序博客网 时间:2024/04/30 17:51

1.当类中定义了静态数据成员时,由于静态数据成员和静态变量原理相同(是一个含有作用域的特殊全局变量),因此该静态数据成员的初值会被写入编译链接后的执行文件中

2.当程序被加载时,OS将执行文件中的数据读到对应的内存单元里,静态数据成员便已经存在,而这时类并没有实例对象。所以静态数据成员和对象之间的生命周期不同,并且静态数据成员也不属于某一对象,与对象之间是一对多的关系。

3.静态数据成员仅仅和类相关,和对象无关,多个对象可以共同拥有同一个静态数据成员

class CStatic
{
public:
    static int m_snInt;
    int m_nInt;
};
 
int CStatic::m_snInt = 12;
 
int main(void) {
    CStatic a;
    CStatic b;
 
    int nSize = sizeof( a );
    printf("CStatic:%d\r\n", nSize );
 
    printf("%x\r\n", &a.m_nInt);
    printf("%x\r\n", &a.m_snInt);
 
    printf("%x\r\n", &b.m_nInt);
    printf("%x\r\n", &b.m_snInt);
 
    return 0;
}

两个对象各自的额数据成员在内存中的地址不同,而静态成员的地址却相同。可见,类中的普通数据成员对于同类对象而言是独立存在的,而静态成员则是所有同类对象公用的数据

因为静态成员有此特性,所以在计算类和对象的长度时,静态成员属于特殊的独立个体,不被计算在其中

   

1.静态数据成员的地址是个常量地址,可通过立即数间接寻址的方式访问。

2.普通数据成员的地址在EBP-X中是一个栈空间地址。

3.普通数据成员函数只有在类对象产生后才存在,地址值无法确定,只能以寄存器相对间接寻址的方式访问。

所以,在成员函数中使用这两种数据成员时,由于静态成员变量不属于任何对象,因此访问时无需this指针。而普通的数据成员数据对象所有,访问时需要this指针


class CStatic
{
public:
    void ShowNumber();
    static int m_snInt;
    int m_nInt;
};
 
int CStatic::m_snInt = 9;
 
void CStatic::ShowNumber()
{
    printf"m_nInt = %d, m_snInt = %d\r\n", m_nInt, m_snInt );
}
 
int main(void) {
    CStatic Static;
    Static.m_snInt = 1;
    Static.m_nInt = 3;
    Static.ShowNumber();
 
    return 0;
}




静态数据成员中反汇编代码中很难被识别,因为其展示形态与全局变量相同,很难被还原成对应的高级代码。可参考其代码的功能。



1.当类中定义了静态数据成员时,由于静态数据成员和静态变量原理相同(是一个含有作用域的特殊全局变量),因此该静态数据成员的初值会被写入编译链接后的执行文件中
0 0
原创粉丝点击