流浪在宁

走我的路,让你去说吧
posts - 1, comments - 0, trackbacks - 0, articles - 0
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

类的静态数据成员

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, 非静态数据成员不能作为实参

     };


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理