static类成员

来源:互联网 发布:淘宝crm软件 编辑:程序博客网 时间:2024/05/16 12:58

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.hint 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成员函数没有对象,所以、、、