【C++深度剖析学习总结】 20 类的静态成员变量和类的静态成员函数

网友投稿 484 2022-05-30

【C++深度剖析学习总结】 20 类的静态成员变量和类的静态成员函数

类的静态成员变量

1.成员变量的回顾

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

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

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

2.新的需求

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

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

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

实验1 解决方案的尝试(失败的解决方案)

#include class Test { private: int mCount; public: Test() : mCount(0) { mCount++; } ~Test() { --mCount; } int getCount() { return mCount; } }; Test gTest; int main() { Test t1; Test t2; printf("count = %d\n", gTest.getCount()); printf("count = %d\n", t1.getCount()); printf("count = %d\n", t2.getCount()); return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

3.静态成员变量—开始介绍新概念

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

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

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

可以通过类名直接访问公有静态成员变量

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

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

静态成员变量的特性

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

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

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

语法规则:

Type ClassName::VarName = value;

实验2 静态成员变量的使用

#include class Test { private: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } int getCount() { return cCount; } }; int Test::cCount = 0; //需要在类的外部单独定义,隶属于test Test gTest; int main() { Test t1; Test t2; printf("count = %d\n", gTest.getCount()); printf("count = %d\n", t1.getCount()); printf("count = %d\n", t2.getCount()); Test* pt = new Test(); //指向堆上的一个指针对象,动态生成,触发构造函数就 ++,输出为4 printf("count = %d\n", pt->getCount()); delete pt; printf("count = %d\n", gTest.getCount()); return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

小结

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

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

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

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

静态成员变量的生命期为程序运行期

类的静态成员函数

1.未完成的需求

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

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

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

实验1 解决方案的尝试

#include class Test { public: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } int getCount() { return cCount; } }; int Test::cCount = 0; int main() { printf("count = %d\n", Test::cCount); //直接打印类名 Test::cCount = 1000; //怎么明显也是不符合安全性的要求 printf("count = %d\n", Test::cCount); return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

运行结果

count = 0

count = 1000

2.问题分析

我们需要什么?

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

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

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

3.静态成员函数

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

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

静态成员函数属于整个类所有

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

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

静态成员函数的定义

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

实验2 静态成员函数

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

#include class Demo { private: int i; public: int getI(); static void StaticFunc(const char* s); static void StaticSetI(Demo& d, int v); }; int Demo::getI() { return i; } void Demo::StaticFunc(const char* s) { printf("StaticFunc: %s\n", s); } void Demo::StaticSetI(Demo& d, int v) { d.i = v; } int main() { Demo::StaticFunc("main Begin..."); Demo d; Demo::StaticSetI(d, 10); printf("d.i = %d\n", d.getI()); Demo::StaticFunc("main End..."); return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

运行结果

StaticFunc: main Begin…

d.i = 10

StaticFunc: main End…

实验3 最后的解决方案

#include class Test { private: static int cCount; public: Test() { cCount++; } ~Test() { --cCount; } static int GetCount() { return cCount; } }; int Test::cCount = 0; int main() { printf("count = %d\n", Test::GetCount()); Test t1; Test t2; printf("count = %d\n", t1.GetCount()); printf("count = %d\n", t2.GetCount()); Test* pt = new Test(); printf("count = %d\n", pt->GetCount()); delete pt; printf("count = %d\n", Test::GetCount()); return 0; }

1

2

3

4

5

6

7

8

9

10

【C++深度剖析学习总结】 20 类的静态成员变量和类的静态成员函数

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

运行结果

count = 2

count = 2

count = 3

count = 2

小结

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

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

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

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

C++

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:图卷积神经网络初探
下一篇:基于华为TICS实现联合风控模型训练
相关文章