c++关键字之static

来源:互联网 发布:淘宝上真正的原单包店 编辑:程序博客网 时间:2024/06/07 01:11
 

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成员则不可以。