//该类用来测试静态成员变量是否占有了类的空间
class TestStatic
{
public:
TestStatic(){};
~TestStatic(){};
static int GetValue(){ return m_nTestValue;}
static void SetValue(int nValue){m_nTestValue = nValue;}
private:
static int m_nTestValue;
static int m_nTestSize;
};
int TestStatic::m_nTestValue = 0;
int TestStatic::m_nTestSize = 0;
//该结构的用来测试在结构体里面使用的类的静态成员变量
//和在结构体外面的是否是一个
struct TestStaticCls
{
TestStatic tsc;
int nTest;
};
/*
总结:
静态成员变量并不占用类空间的大小,如TestStatic类的在VS2003下使用sizeof结果是1,
TestStaticCls使用sizeof结果是8(tsc实际为1,内存对齐占用3个字节).在这里其实类的
作用就相当于静态成员变量的命名空间一样的功能,限制了改全局变量只能通过该类
来访问。放在结构体中也是同样的原理。
*/
TestStatic test1;//第一个对象
test1.SetValue(4);//赋值
TestStatic test2;//第二个对象未赋值
cout<<test2.GetValue()<<endl;//直接输出结果为4
TestStaticCls TestTsc;//结构体
cout<<TestTsc.tsc.GetValue()<<endl;//输出结构体中tsc的值为4
//test1,test2好理解,放在结构体中后让我有点不确定,所以才有此验证代码
//TestStatic的大小为1而已,放在结构体中它也知道去找这个类,再去找这个类的方法
TestTsc.tsc.SetValue(5);//设置结构体
cout<<test1.GetValue()<<endl;//输出第一个对象的值为5,验证了静态变量全局的,不管你是存在于那种结构中。
cout<<sizeof(TestStatic)<<" "<<sizeof(TestStaticCls)<<endl;//输出1 8