博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ static 语义
阅读量:2428 次
发布时间:2019-05-10

本文共 2169 字,大约阅读时间需要 7 分钟。

一、类的static data member

1、永远只有一份内存实体

static意味着该变量属于这个类,而不是属于该类的某个对象。这里的属于可以从存储空间的角度理解,即产生一个新的类对象时,不会再为该对象分配static data member的存储空间。但对对象进行sizeof操作时,static data member的存储空间还是要加上的。class的static data member存储在程序的全局数据区中,在没有产生类对象时就已经获得存储空间分配。static data member 和non-static data member一样遵从public,protected,private访问规则。static语义表明static data member一般用在一个类的所有对象任何时刻应该具有相同值时。

 

看最简单的例子

class CBaseStatic

{
public:
 CBaseStatic(void);
 virtual ~CBaseStatic(void);
 void SetData1(int iData);
 int GetData1();
private:
 static int m_sData1;
 int m_iData2;
};

// 刚开始在类外初始化为0

int CBaseStatic::m_sData1 = 0;

 

 TRACE(_T("--------------------------->%d\n"),sizeof(CBaseStatic));

 CBaseStatic obj1;

 CBaseStatic obj2;

 CBaseStatic obj3;

 TRACE(_T("--------------------------->%d\n"),sizeof(obj1));

 TRACE(_T("--------------------------->%d\n"),sizeof(obj2));

 TRACE(_T("--------------------------->%d\n"),sizeof(obj3));

 TRACE(_T("--------------------------->%d\n"),obj1.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj2.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj3.GetData1());

 obj1.SetData1(100);

 TRACE(_T("--------------------------->%d\n"),obj1.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj2.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj3.GetData1());

 

输出结果为:

--------------------------->8

--------------------------->8
--------------------------->8
--------------------------->8
--------------------------->0
--------------------------->0
--------------------------->0
--------------------------->100
--------------------------->100
--------------------------->100

结果验证了上面所说的,通过obj1改变static data member的值,所有的都变了,表明只有一份内存实体。即使在派生类中也是“共享”基类的那份内存实体,不会分配新的存储空间。

 

看下面代码

class CDrivedStatic :

 public CBaseStatic
{
public:
 CDrivedStatic(void);
 virtual ~CDrivedStatic(void);
};

 

CDrivedStatic objDrived;

 objDrived.SetData1(200);

 TRACE(_T("--------------------------->%d\n"),obj1.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj2.GetData1());

 TRACE(_T("--------------------------->%d\n"),obj3.GetData1());

 

输出结果:

--------------------------->200

--------------------------->200
--------------------------->200

记住,static data member唯一的一份内存实体。

 

转载地址:http://xqcmb.baihongyu.com/

你可能感兴趣的文章
一年一度程序员“补课”季来袭,618 背后技术大公开!
查看>>
我和美国 AI 博士聊了聊:2020 年,这件事比存钱更重要!
查看>>
陈芳,高考之后我要学计算机专业,将来做 IT 发财了,我就娶你!
查看>>
“编程能力差的程序员,90%输在这事上!”谷歌AI专家:都是瞎努力!
查看>>
张一鸣做电商:再造一个“抖音”
查看>>
“你写的 Bug 让我来改好吗” | 每日趣闻
查看>>
大厂技术文档:Redis+Nginx+Spring全家桶+Dubbo精选
查看>>
笑死,别再黑程序员了好吗? | 每日趣闻
查看>>
Python 爬取 13966 条运维招聘信息,这些岗位最吃香
查看>>
28 岁退休程序员自述:不是富二代,行政专业出身,非典型程序员
查看>>
那时刚毕业的我,曾参与惊心动魄 3Q 大战
查看>>
程序员爬取 5000+ 口红商品数据,差点比女朋友更懂口红?
查看>>
30 张图解 | 高频面试知识点总结:面试官问我高并发服务模型哪家强?
查看>>
以太坊创始人V 神:普通人看见现在,天才看见未来
查看>>
厉害!从电影花瓶到 Wi-Fi 之母,这才是乘风破浪的姐姐!
查看>>
中国开源大爆发进行时,你没掉队吧?
查看>>
用 Python 实现抖音上的“人像动漫化”特效,原来这么简单!
查看>>
一周内咸鱼疯转 2.4W 次,最终被所有大厂封杀!
查看>>
关于鸿蒙 2.0,那些开发者不知道的一切
查看>>
Google 排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
查看>>