C++中类的静态成员变量

Posted dishengandziyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++中类的静态成员变量相关的知识,希望对你有一定的参考价值。

1,成员变量的回顾:

    1,通过对象名能够访问 public 成员变量;

    2,每个对象的成员变量都是专属的;

    3,成员变量不能在对象之间共享;

       1,在做程序设计中,成员变量一般是私有的、至少不是公有的;

   

2,新的需求:

    1,统计在程序运行期间某个类的对象数目;

    2,保证程序的安全性(不能使用全局变量);

    3,随时可以获取当前对象的数目;

   

3,解决方案的尝试编程实验:

 1 #include <stdio.h>
 2 
 3 int gCount = 0;
 4 
 5 class Test
 6 {
 7 private:
 8     int mCount;
 9     
10 public:
11     Test() : mCount(0)
12     {
13         // mCount++;
14         gCount++;
15     }
16     
17     ~Test()
18     {
19         // --mCount;
20         gCount--;
21     }
22     
23     int getCount()
24     {
25         // return mCount;
26         return gCount;  // 类的成员函数中可以调用全局变量,全局变量在类的任何地方都可以访问和改变它;
27     }
28 };
29 
30 Test gTest;
31 
32 int main()
33 {
34     Test t1;
35     Test t2;
36     
37 /*   
38     printf("count = %d\n", gTest.getCount());  // 打印 1,成员变量每个类各有一个,先被初始化为 0,后加加;
39     printf("count = %d\n", t1.getCount());  // 打印 1 ,成员变量、每个类各有一个,先被初始化为 0,后加加;
40     printf("count = %d\n", t2.getCount());  // 打印 1,成员变量、每个类各有一个,先被初始化为 0,后加加;
41 */   
42 
43     printf("count = %d\n", gTest.getCount());  // 打印 3;
44     printf("count = %d\n", t1.getCount());  //  打印 3;
45     printf("count = %d\n", t2.getCount());  //  打印 3;
46     
47     return 0;
48 }

    1,不可以使用全局变量,全局变量在当代软件开发中是不受欢迎的,因为它不     够安全,任意地方都可以访问和修改,舍弃;

   

4,静态成员变量:

    1,在 C++ 中可以定义静态成员变量:

       1,静态成员变量属于整个类所有;

           1,不是隶属于某个对象所有;

       2,静态成员变量的生命期不依赖于任何对象;

           1,其生命期如同全局变量一样,静态成员变量的生命期是程序的运行周期;

       3,可以通过类名直接访问共有静态成员变量;

           1,静态成员变量也有访问等级;

       4,所有对象共享类的静态成员变量;

       5,可以通过对象名访问公有静态成员变量;

      

5,静态成员变量的特性:

    1,在定义时直接通过 static 关键字修饰;

    2,静态成员变量需要在类外单独分配空间;

       1,其隶属于整个类,不可能占用对象的空间;

       2,只能在类的外部单度分配空间;

    3,静态成员变量在程序内部位于全局数据区;

       1,全局数据区保存已初始化的全局变量或静态局部变量;

       2,静态成员变量和全局变量、静态局部变量是一致的,存储在同一个地方,但是只有在类的外部重新定义静态成员变量才可以存储到静态存储区;

       3,静态存储变量一般的会初始化,所以其存储在全局数据区;

   4,语法规则:

    1,Type ClassName::VarName = value;

    2,是在类的外部直接定义出来;

  

6,静态成员变量的使用编程实验:

 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5 private:
 6     static int cCount;  // 得到静态成员变量;这里编译器显示没有办法访问到 Test::cCount,也就是说链接器链接的时候找不到 Test::cCount 的存储空间;静态成员变量不隶属于任何的对象,因此要单独定义它,使得编译器知道这个静态成员变量需要在全局数据区分配空间;见下面注释;
 7     
 8 public:
 9     Test()
10     {
11         cCount++;
12     }
13     
14     ~Test()
15     {
16         --cCount;
17     }
18     
19     int getCount()
20     {
21         return cCount;
22     }
23 };
24 
25 int Test::cCount = 0;  // 需要在类的外部单独定义,以便为它分配空间;要用作用域分辨符告诉编译器 cCount 隶属于 Test 这个类;
26 
27 Test gTest;
28 
29 int main()
30 {
31     Test t1;
32     Test t2;
33     
34     printf("count = %d\n", gTest.getCount());  // 3
35     printf("count = %d\n", t1.getCount());  // 3
36     printf("count = %d\n", t2.getCount());  // 3
37     
38     Test* pt = new Test();  
39      
40     printf("count = %d\n", pt->getCount());  // 4
41     
42     delete pt;  
43     
44     printf("count = %d\n", gTest.getCount());  // 3
45     
46     return 0;
47 }

 

7,小结:

    1,类中可以通过 static 关键字定义静态成员变量;

    2,静态成员变量隶属于类所有;

    3,每一个对象都可以访问静态成员变量;

    4,静态成员变量在全局数据区分配空间;

       1,静态成员变量不像静态局部变量一样可以直接保存到静态存储区,所以还要在类外部定义静态存储变量,以便能够给其分配到静态存储区里面;

    5,静态成员变量的生命周期为程序运行期;

以上是关于C++中类的静态成员变量的主要内容,如果未能解决你的问题,请参考以下文章

C++中类里面定义 静态成员变量的问题

C++中类的静态成员初始化

c++中类的静态成员对象

C++中类的静态数据成员函数解析

C++类静态成员变量作用域共享问题

同一线程中类的所有实例中的类的共享数据成员