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

网友投稿 523 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.问题分析

我们需要什么?

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

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

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

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

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

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实现联合风控模型训练
相关文章