26, 类的静态成员函数

Posted liuyueyue

tags:

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

1、未完成的需求

  • 统计在程序运行期间某个类的对象数目 --yes

  • 保证程序的安全性不能使用全局变量)--yes

  • 随时可以获取当前对象的数目(Failure)

尝试解决方案:

 1 #include<stdio.h> 
 2 
 3 //解决没有类对象时也能随时获取类的对象数目
 4 
 5 class Test
 6 {
 7 public:
 8     static int cCount;      //静态成员变量访问级别设置为public
 9 
10 public:
11     Test()                     
12     {
13         cCount++;
14     }
15     ~Test()
16     {
17         cCount--;
18     }
19 
20     int getCount()
21     {
22         return cCount;
23     }
24 };
25 
26 int Test::cCount = 0;     //静态成员变量
27 
28 
29 int main()
30 {
31 
32 //    printf("count=%d
", gTest.getCount());  //没有对象无法打印静态成员变量保存的数
33 
34     printf("count=%d
", Test::cCount);      //要通过类名访问cCount静态成员变量    0
35 
36     Test::cCount = 1000;      //意外操作
37     printf("count=%d
", Test::cCount);         //安全性不好  1000 ---但是当前没有任务对象
38 
39     return 0;
40 }

结论:我们需要什么?

  • 不依赖对象就可以访问静态成员变量

  • 必须保证静态成员变量的安全性-------前面把静态成员变量访问级别改为public不安全,太暴力

  • 方便快捷的获取静态成员变量的值

2. 静态成员函数

(1)静态成员函数是类中特殊的成员函数,属于整个类所有

(2)可以通过类名直接访问公有静态成员函数

(3)可以通过对象名访问公有静态成员函数

(4)静态成员函数定义:直接通过static关键字修饰成员函数

      技术图片

 实例:

 1 #include<stdio.h> 
 2 
 3 //解决没有类对象时也能随时获取类的对象数目       解决安全性
 4 //不依赖对象就能访问静态成员变量,保证静态成员的安全性,获取静态成员变量的值
 5 //通过--类名--访问共有的-----静态成员函数---普通函数之前加static
 6 
 7 class Demo
 8 {
 9 private:
10     int i;
11 public:
12     int getI();
13     static void StaticFunc(const char* s);              //静态成员函数StaticFunc
14     static void StaticSetI(Demo& d, int v );            //静态成员函数StaticSetI
15 }; 
16 
17 int Demo::getI()
18 {
19     return i;
20 }
21 
22 void Demo::StaticFunc(const char* s)
23 {
24     printf("StaticFunc: %s
",s);
25 }
26                                         //第一个参数----返回类型表示返回Demo类对象的引用
27 void Demo::StaticSetI(Demo& d, int v)   //静态成员函数只能通过参数对象Demo&名 d访问成员变量
28 {
29     d.i = v;                             //将第二个参数v的值赋值到,第一个参数对象d的成员变量i     i=v
30 }
31 
32 int main()
33 {
34     Demo::StaticFunc("main Begin...");           //类名------调用静态成员函数StaticFunc
35 
36     Demo d;              
37 
38     d.StaticFunc(d, 10);                        //对象名d-----调用静态成员函数StaticFunc--------设置i
39 
40     Demo::StaticSetI(d, 10);                    //类名--访问静态成员函数StaticSetI
41     
42     printf("d.i=%d
",d.getI());
43 
44     Demo::StaticFunc("main End...");
45 
46     return 0;
47 }

3. 静态成员函数 VS 普通成员函数

技术图片

最后解决方案:


1
#include<stdio.h> 2 3 //解决没有类对象时也能随时获取类的对象数目 4 5 class Test 6 { 7 private: 8 static int cCount; 9 10 public: 11 Test() 12 { 13 cCount++; 14 } 15 ~Test() 16 { 17 cCount--; 18 } 19 20 static int GetCount() //静态成员函数 21 { 22 return cCount; 23 } 24 }; 25 26 int Test::cCount = 0; //使用前必须在类外给静态成员变量分配空间 27 28 29 int main() 30 { 31 printf("count=%d ", Test::GetCount()); //通过类名获取当前cCount值 //0 32 33 Test t1; //局部对象 34 Test t2; 35 36 37 printf("count=%d ", t1.GetCount()); //通过对象名获取当前cCount值 2 38 printf("count=%d ", t2.GetCount()); //2 39 40 41 Test* pt = new Test(); //指针指向Test对象,通过指针访问 42 printf("count=%d ", pt->GetCount()); //3 43 delete pt; 44 45 printf("count=%d ", Test::GetCount()); //2 46 47 return 0; 48 }

4. 小结

(1)静态成员函数是类中特殊的成员函数

(2)静态成员函数没有隐藏的this参数

(3)静态成员函数可以通过类名和对象直接访问

(4)静态成员函数只能直接访问静态成员变量/函数,不能访问普通成员变量/函数

 

以上是关于26, 类的静态成员函数的主要内容,如果未能解决你的问题,请参考以下文章

java中的静态static关键字

静态成员函数无法访问类的受保护成员

java 静态代码块 代码块 构造函数 静态成员变量 成员变量的初始化顺序

C++ - 如何从同一个类的静态函数访问一个类的私有成员?

调用和初始化类的静态成员函数

实用工具类的静态成员(null)生命周期