Posted on 2008-10-04 17:04
rowzi 阅读(192)
评论(0) 编辑 收藏 引用 所属分类:
C++使用
类的静态数据成员被当作类对象的全局对象。所有该类的对象都共享一个类的静态成员,而对于非静态成员,每一个对象都含有自己的拷贝。
使用静态数据成员可以节省内存,因为它是所有对象所公有的,因此,对多个对象来说,静态数据成员只存储一处,供所有对象共用。静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,保证所有对象存取更新后的相同的值,这样可以提高时间效率。
与全局对象相比,类的静态成员有如下优势:
1.
静态数据成员在类的名字空间里,没有进入全局对象空间,因此不存在于程序中其他名字冲突的问题;
2.
可以实现信息隐藏,因为类的静态数据成员可以是
private
,而全局对象就不行。
静态数据成员的声明与初始化
:
class Test
{
public:
static int charge; //
声明类的静态数据成员
int GetPrice();
private:
int number;
};
int Test::charge = 5; //
初始化类的静态数据成员
与全局对象一样,静态数据成员,在程序的类的声明中,只能提供一个定义。这就意味着静态数据成员的初始化不能在类声明的头文件中,而应该放在含有类的非
inline
函数定义的文件中。
作为一个特例,整数型的
const
静态数据成员可以在类体中用一个常量值进行初始化,例如:
class Test
{
public:
static int charge = 5; //
整数型的
const
静态数据成员可以在类体中初始化
int GetPrice();
private:
int number;
};
类的静态数据成员在使用中有
2
个独特的地方:
1.
静态数据成员的类型可以是其所属类对象,而非静态数据成员的类型只能是其所属类的指针或引用。
class Test
{
public:
static Test test; //ok
类的静态数据成员可以是其所属类对象
Test test; //error
非静态数据成员不能是其所属类对象
Test *ptest; //ok
类指针
Test &ctest; //ok
类引用
};
2.
类的静态数据成员可以作为类的成员函数的缺省实参,而非静态数据成员则不行。
class Test
{
public:
static int m_sivar;
int m_ivar;
int GetVar1(int var = m_sivar); //ok,
静态数据成员可以作为实参
int GetVar2(int var = m_ivar); //error,
非静态数据成员不能作为实参
};