static类成员包括:static数据成员,static数据函数。
同全局对象相比,static成员有以下优点
(1)static成员的名字是在类的作用域中,因此可避免与其他类的成员或全局对象的名字冲突
(2)可以实施封装。static成员可以是私有成员,而全局对象不可以。
(3)通过阅读程序容易看出,static成员适于特定类关联。这种可见性可清晰地显式程序员的意图。
一 static数据成员
static数据成员独立于该类的任意对象而存在;每个static数据成员是与类关联的对象,并不与该类的对象相关联。
static数据成员必须在类定义体的外部定义(正好一次),不像普通的数据成员,static成员不是通过类构造函数进行初始化,而是应该在定义时就进行初始化。
保证对象正好定义一次的最好办法,就是讲static数据成员的定义放在包含类的非内联成员函数定义的文件中—C++ Primer
class Foo{
public:
****
private:
static int a;
static const int b=30;
}; //in file a.h
int Foo::a=1; //in file a.c which define class member function
对于static数据成员可采用以上方式进行初始化。注意:static成员不能通过构造函数初始化。
像使用任意的类成员一样,在类定义体外部引用累的static成员时,必须指定成员是在那个类中定义的。然而,static关键字只能用于类定义体内部的声明中,定义不能标示为static———c++ Primer。
总结一下:(1)static数据成员在类体内声明,在类体外定义和初始化。一般放在定义成员函数的.c文件中。
(2)在类体外的定义不必声明static,直接按 int Foo::a=1;形式定义即可。
(3)对于static类类型数据成员,用 Foo Bar::fooBar;定义,编译器会自动调用Foo的构造函数初始化。
(4)static数据成员可以被成员函数任意调用,但是static成员函数只能调用static数据成员。
但是,对于整型static const 成员可以在类的定义体中进行初始化。如 static const int b=30;但是还是要在类体外进行定义,采用如下格式
const int Foo::b;//不必在进行赋值。也不能赋值了
二 static成员函数
注意:static保留字只出现在类体中。
static成员函数只与类关联,不与对象关联,因此没有this指针,使用非static成员显式或隐式的引用this是错误的。
static不能被声明为const函数。因为const函数是用来保证 该成员函数不会修改成员函数所在的对象的,而static成员函数没有对象,所以、、、