static Value m_Val; 这句里的static是什么意思?怎么理解?

lululiming 2009-03-13 01:32:12
程序代码:
#include<iostream>

using namespace std;

class Value
{
public:
Value(int nVal) {m_nVal=nVal;printf("Call Value::Value(int nValue)\n");}
~Value() {printf("Call Value::~Value()\n");}
Value& operator=(int nVal)
{
m_nVal=nVal;
printf("Call Value::operator=\n");
return *this;
}
void Dump() {printf("Value::m_nVal=%d\n",m_nVal);}
protected:
int m_nVal;
};

class Base
{
public:
Base() {Init();}
virtual ~Base() {Release();}
virtual void Init() {printf("Call Base::Init()\n");}
virtual void Release() {printf("Call Base::Release()\n");}
virtual void Dump() {printf("Call Base::Dump()\n");}
};

class Derive:public Base
{
public:
Derive() {printf("Call Derive::Derive()\n");}
~Derive() {printf("Call Derive::~Derive()\n");}
virtual void Init() {m_Val=2;printf("Call Derive::Init()\n");}
virtual void Release() {printf("Call Derive::Release()\n");}
virtual void Dump() {m_Val.Dump();}
protected:
static Value m_Val;
};

Value Derive::m_Val=0;

void DestroyObj(Base * pOb)
{
pOb->Dump();
delete pOb;
}

void main()
{
Derive *pOb=new Derive;
DestroyObj(pOb);
}
...全文
129 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lululiming 2009-03-13
  • 打赏
  • 举报
回复
是因为static成员变量是属于类Derive的一部分,所以在构建Derive对象前就要用Value Derive::m_Val=0;语句来初始化成员(static Value m_Val; ),所以要先调用Value的构造函数,可以这样理解吗?
所以结果为:
Call Value::Value(int nValue)
Call Base::Init()
Call Derive::Derive()
Value::m_nVal=0
Call Derive::~Derive()
Call Base::Release()
Call Value::~Value()


谢谢!
tangshuiling 2009-03-13
  • 打赏
  • 举报
回复

static Value m_Val; //静态成员变量,类型为Value,使用时需要初始化
Value Derive::m_Val=0; //这里初始化,用整数值0对其赋值,唤醒类Value的构造函数
Value(int nVal) {m_nVal=nVal;printf("Call Value::Value(int nValue)\n");}
0到类Value存在隐式类型转换 0->Value
george5016 2009-03-13
  • 打赏
  • 举报
回复
在C++类中的static成员变量是一个特殊的存在,它不属于对象,而是类的一部分.

因为static成员变量是类的一部分,所以程序可以在还没有诞生任何对象的时候就
处理此种成员变量.关键是你必须初始化它.

在初始化static成员变量时,不能用一般的方式.但实际上,static成员变量并不是因为对象的实现才得以实
现的,它本来就存在,可以想象一下全局变量.而且构造函数可能一再的被调用,但变量
的初值却只应该设定一次.

static成员变量的初始化应该独立与构造函数外,额外用一个static函数或
在类外通过作用域分辨符来赋初值.
s79947171 2009-03-13
  • 打赏
  • 举报
回复
类的静态变量成员,只不过不是普通数据类型而已,是Value 类型的
pengzhixi 2009-03-13
  • 打赏
  • 举报
回复
static Value m_Val; //类的静态数据成员,所有类的对象都可以公用,但又不属于任何一个类对象.
healer_kx 2009-03-13
  • 打赏
  • 举报
回复
类变量,非对象成员,是类的属性。
lululiming 2009-03-13
  • 打赏
  • 举报
回复
红色的那一句里的static怎么理解? 谢谢 自己顶一个!

64,641

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧