静态数据成员

本文深入探讨了静态数据成员的概念及其实现原理,包括其在内存中的存储方式、生命周期特点、与普通成员的区别以及如何在代码中正确使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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.当类中定义了静态数据成员时,由于静态数据成员和静态变量原理相同(是一个含有作用域的特殊全局变量),因此该静态数据成员的初值会被写入编译链接后的执行文件中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值