第25课 - 类的静态成员变量

本文介绍C++中静态成员变量的概念及其应用场景,包括如何统计类的对象数目,保证程序安全性,并随时获取当前对象数目。文中详细解释了静态成员变量的定义、特性和语法规则。

第25课 - 类的静态成员变量

1. 成员变量的回顾

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

  (2)每个对象的成员变量都是专属的,成员变量不能在对象之间共享

  这么看,如果多个对象想操作同一个数据,从目前来看只能使用全局变量(每个对象都可以操作全局作用域的全局变量),但是这样存在安全隐患,在现代软件开发中不推荐这种方式。

  那么,有没有其它更好的方式呢?下面我们就引入了类的静态成员变量的概念。

2. 新的需求

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

  (2)保证程序的安全性   ==>  不能使用全局变量。由于全局变量在程序的任何地方都可能修改,因此现代的软件开发中不推荐使用全局变量。

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

 1 // 由于对象的成员变量都是专属的,成员变量不能在对象之间共享
 2 // 因此下面这种尝试无法统计某个类的对象数目
 3 // 在程序开发中不可能一次就成功,需要进行多次的尝试和优化
 4 
 5 #include <stdio.h>
 6 
 7 class Test
 8 {
 9 private:
10     int mCount;
11 public:
12     Test() : mCount(0)
13     {
14         mCount++;
15     }
16     ~Test()
17     {
18         --mCount;
19     }
20     int getCount()
21     {
22         return mCount;
23     }
24 };
25 
26 
27 Test gTest;
28 
29 int main()
30 {
31     Test t1;
32     Test t2;
33     
34     printf("count = %d\n", gTest.getCount());  // 1
35     printf("count = %d\n", t1.getCount());    // 1
36     printf("count = %d\n", t2.getCount());    // 1
37 
38     return 0;
39 }
解决方案的尝试

3. 静态成员变量

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

  (1)静态成员变量隶属于整个类所有

  (2)静态成员变量的生命周期不依赖于任何对象,静态成员变量的生命期如同全局变量一样,是程序的运行周期  【静态成员变量的生命周期和全局变量的生命周期相同】

  (3)可以通过类名直接访问公有静态成员变量             【类名 :: 静态成员变量名(Class_name :: static_member)】

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

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

3.2 静态成员变量的特性

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

  (2)静态成员变量不占用对象的空间,需要在类外单独分配空间     使用 sizeof() 打印类的大小,可以验证这一点(空类也占用一个字节)】

  (3)静态成员变量在程序内部位于全局数据区             【全局变量、static修饰的局部变量、类的静态成员变量这三者都在全局数据区】

3.3 语法规则

  Type ClassName::VarName = value;  // 这里前面不用加 static

 1 #include <stdio.h>
 2 
 3 class Test
 4 {
 5 private:
 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 
23 int Test::cCount = 0;
24 
25 Test gTest;
26 
27 int main()
28 {
29     Test t1;
30 
31     Test t2;
32 
33     printf("count = %d\n", gTest.getCount());   // 3
34     printf("count = %d\n", t1.getCount());       // 3
35 
36     printf("count = %d\n", t2.getCount());  // 3
37 
38     Test* pt = new Test();
39 
40     printf("count = %d\n", pt->getCount()  // 4
41 
42     delete pt;    // 执行了析构函数
43 
44     printf("count = %d\n", gTest.getCount());   // 3
45 
46     return 0;
47 }
静态成员变量的使用

4. 小结

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

  (2)静态成员变量隶属于类所有,不属于某个对象

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

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

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

 

【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究(Matlab代码实现)内容概要:本文围绕【Koopman】遍历论、动态模态分解和库普曼算子谱特性的计算研究展开,重点介绍基于Matlab的代码实现方法。文章系统阐述了遍历理论的基本概念、动态模态分解(DMD)的数学原理及其与库普曼算子谱特性之间的内在联系,展示了如何通过数值计算手段分析非线性动力系统的演化行为。文中提供了完整的Matlab代码示例,涵盖数据驱动的模态分解、谱分析及可视化过程,帮助读者理解并复现相关算法。同时,文档还列举了多个相关的科研方向和技术应用场景,体现出该方法在复杂系统建模与分析中的广泛适用性。; 适合人群:具备一定动力系统、线性代数与数值分析基础,熟悉Matlab编程,从事控制理论、流体力学、信号处理或数据驱动建模等领域研究的研究生、博士生及科研人员。; 使用场景及目标:①深入理解库普曼算子理论及其在非线性系统分析中的应用;②掌握动态模态分解(DMD)算法的实现与优化;③应用于流体动力学、气候建模、生物系统、电力系统等领域的时空模态提取与预测;④支撑高水平论文复现与科研项目开发。; 阅读建议:建议读者结合Matlab代码逐段调试运行,对照理论推导加深理解;推荐参考文中提及的相关研究方向拓展应用场景;鼓励在实际数据上验证算法性能,并尝试改进与扩展算法功能。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值