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, 类的静态成员函数的主要内容,如果未能解决你的问题,请参考以下文章