Static
对于特定类类型的全体对象来讲,访问一个全局对象有时是很必要的。然而,对一个类来说,全局对象或许会破坏封装。取而代之的方法是,类定义静态成员(static)来代替一个可普遍访问的全局对象。
static成员包括static数据成员和static成员函数。
通常,非static数据成员存在于类类型的每个对象中,而static数据成员独立于该类的所有对象而存在,每个static数据成员与类关联,而不与类的对象关联。
使用static 成员代替全局对象的优点:
static 成员的函数名是在类的作用域中,因此可以避免与其他来的成员或全局对象名字冲突。
可以实施封装,即static成员可以是私有成员,而全局对象不可以。
Template<class T>
Class A
{
public:
static T Test();
private:
static T var;
}
此类中有一个单独的var对象和Test()成员函数由类A的全体对象拥有。
可以通过作用域操作符从类直接调用static成员或者通过对象、引用以及指向该类类型对象的指针间接调用。
关于static成员函数
static 函数没有this指针。
因为static 成员是类的组成部分而非任何对象的组成部分分,因此static 成员函数没有this指针。
static成员函数不能被声明为const函数。
因为将成员函数声明为const就是承诺不会修改该函数所属的对象(因为本来该static函数就不是任何对象的组成部分,何必多此一举呢?有点绕开口是吧,呵呵)。
static成员函数也不能声明为虚函数。
因为static 成员函数是属于类的没有this指针,而virtual 函数必须有this指针的感念,根据this指针实际指向的类来决定如何调用(多态)。
关于staic 数据成员
在类定义体中声明static数据成员后,它必须在类定义体外部再被定义,且正好一次,为了保证其正好被定义一次,一般的做法是将其放在包含类的非内联成员函数定义的文件中。同样地,在类定义体外部定义时,不能重复指定static关键字;
static数据成员不能通过类构造函数初始化,一般(除整型const static变量外)是在类定义体外部定义时初始化;
整型const static数据成员作为一种特殊情况,可以在类定义体内部指定初始化(前提是初始化表达式是一个常量);
static 数据成员的类型可以是该成员所属的类类型。非statiic成员被限定声明为其自身类对象的指针或引用。
Class A
{
public:
…
private:
static A a1;//OK
A * p1;//OK
A a2;//ERROR
}
static 数据成员可以作为默认实参。而非static成员则不可以。