博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中的静态成员函数
阅读量:4683 次
发布时间:2019-06-09

本文共 3179 字,大约阅读时间需要 10 分钟。

1,问完成的需求:

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

       1,静态成员变量满足了这个需求;

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

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

       1,有没有什么特别的地方或边界点没有考虑到呢?

   

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

1 #include 
2 3 class Test 4 { 5 public: 6 static int cCount; 7 public: 8 Test() 9 {10 cCount++;11 }12 ~Test()13 {14 --cCount;15 }16 int getCount()17 {18 return cCount;19 }20 };21 22 int Test::cCount = 0;23 24 25 int main()26 {27 printf("count = %d\n", Test::cCount); // 打印 0;28 29 Test::cCount = 1000;30 31 printf("count = %d\n", Test::cCount); // 打印 1000;32 33 return 0;34 }

    1,当没有定义对象时候,应该打印 0,而这里不能满足,完全没办法打印,因     为必须要对象才可以调用打印结果;

    2,共有静态成员变量可以解决临界问题,但是不安全,会被误操作;

   

3,问题分析:我们需要什么?

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

    2,必须保证静态成员变量的安全性;

    3,方便快捷的获取静态成员变量的值;

   

4,静态成员函数:

    1,在 C++ 中可以定义静态成员函数:

       1,静态成员函数是类中特殊的成员函数;

       2,静态成员函数隶属于整个类所有;

       3,可以通过类名直接访问公有静态成员函数;

       4,可以通过对象名访问公有静态成员函数;

      

5,静态成员函数的定义:

    1,直接通过 static 关键字修饰成员函数:

    2,代码示例:

1 class Test 2 { 3 public: 4   static void Func1() {} 5   static int Func2(); 6 }; 7  8 int Test::Func2()  9 {10   return 0;11 }

 

6,静态成员函数示例编程实验:

1 #include 
2 3 class Demo 4 { 5 private: 6 int i; 7 8 public: 9 int getI();10 static void StaticFunc(const char* s);11 static void StaticSetI(Demo& d, int v);12 // static void StaticSetI(int v);13 };14 15 int Demo::getI()16 {17 return i;18 }19 20 void Demo::StaticFunc(const char* s)21 {22 printf("StaticFunc: %s\n", s);23 }24 25 void Demo::StaticSetI(Demo& d, int v)26 {27 d.i = v; // 这是通过对象名访问,没有直接访问成员变量;28 }29 30 /*31 void Demo::StaticSetI(int v)32 {33 i = v; // 编译器显示,在静态成员变量中不能访问成员变量 i;因为静态成员函数不可以直接访问成员变量,访问成员变量需要 this 指针的指向,而这里静态成员函数没有 this 指针;34 }35 */36 37 int main()38 {39 Demo::StaticFunc("main Begin...");40 41 Demo d;42 43 d.StaticSetI(d, 1); // 通过变量名调用静态成员函数44 45 printf("d.i = %d\n", d.getI()); // 打印 1;和不同成员变量使用方法一样;46 47 Demo::StaticSetI(d, 10); // 通过类名调用静态成员函数;48 49 printf("d.i = %d\n", d.getI()); // 打印 10;50 51 Demo::StaticFunc("main End...");52 53 return 0;54 }

   

7,静态成员函数 vs 普通成员函数:

    1,可以通过对象名调用静态成员函数;

    2,不能访问普通成员变量和成员函数,因为没有 this 指针;

    3,静态成员函数存放在代码段,可以供对象和成员函数调用;

   

8,最后的解决方案编程实验:

1 #include 
2 3 class Test 4 { 5 private: 6 static int cCount; // 不被外界访问,安全;一直存在;被静态成员函数访问,并通过类名调用; 7 8 public: 9 Test()10 {11 cCount++;12 }13 14 ~Test()15 {16 --cCount;17 }18 19 static int GetCount()20 {21 return cCount;22 }23 };24 25 int Test::cCount = 0;26 27 int main()28 {29 printf("count = %d\n", Test::GetCount()); // 打印 0;30 31 Test t1;32 Test t2;33 34 printf("count = %d\n", t1.GetCount()); // 打印 2;35 printf("count = %d\n", t2.GetCount()); // 打印 2;36 37 Test* pt = new Test();38 39 printf("count = %d\n", pt->GetCount()); // 打印 3;40 41 delete pt;42 43 printf("count = %d\n", Test::GetCount()); // 打印 2;44 45 return 0;46 }

   

9,小结:

    1,静态成员函数是类中特殊的成员函数;

    2,静态成员函数没有隐藏的 this 参数;

       1,因此不能访问普通的成员函数及普通的成员变量;

    3,静态成员函数可以通过类名直接访问;

    4,静态成员函数只能直接访问静态成员变量(函数);

转载于:https://www.cnblogs.com/dishengAndziyu/p/10907138.html

你可能感兴趣的文章
VMware装CentOS注意事项 IP
查看>>
代码调试多试几招
查看>>
bicycle
查看>>
(二)apache atlas配置和运行
查看>>
内部类之非静态内部类补充
查看>>
用户画像展示
查看>>
LeetCode题解-----Sliding Window Maximum
查看>>
【USACO 5.4.1】Canada Tour
查看>>
(转)SharePoint对象模式获取“用户或用户组”栏的值
查看>>
学习笔记2014/4/15
查看>>
pyqt pyinstaller使用说明
查看>>
C#中StreamReader读取中文出现乱码
查看>>
引用堆中的对象
查看>>
用CSS开启硬件加速来提高网站性能(转)
查看>>
使用BufferedReader的时候出现的问题
查看>>
加快页面加载速度的方法
查看>>
Oozie协作框架
查看>>
linux安装图形界面
查看>>
Android广播发送失败
查看>>
博弈论之入门小结
查看>>