第25课 类的静态成员变量
0.C语言的static关键字
https://www.cnblogs.com/hoiday/protected/p/9998577.html
(1)static关键字指明变量的“静态”属性——static修饰的局部变量和全局变量存储在程序静态区(静态变量,只能被初始化一次)
(2)static关键字同时具有“作用域限定符”
①static修饰的全局变量作用域只是声明的文件中
②static修饰的函数作用域只是声明的文件中
1. 成员变量的回顾
(1)通过对象名能够访问public成员变量
(2)每个对象的成员变量都是专属的
(3)成员变量不能在对象之间共享
2、新的需求
-
统计在程序运行期间某个类的对象数目
-
保证程序的安全性(不能使用全局变量)
-
随时可以获取当前对象的数目
【编程实验】解决方案的尝试 25-1.cpp
#include <stdio.h> 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; }
运行结果:
3. 静态成员变量
(1)C++中的静态成员变量
①静态成员变量属于整个类所有
②静态成员变量的生命期不依赖于任何对象
③可以通过对象名,也可以通过类名直接访问公有静态成员变量
④所有对象共享类的静态成员变量
(2)静态成员变量的特性
①在定义时直接通过static关键字修饰
②静态成员变量在程序内部位于全局数据区,所以需要类外为其单独分配空间。
(因为new或栈中的对象只会为非静态成员分配空间,而不会为静态成员分配,所以必须在类外单独为其分配空间)
③为静态成员变量分配空间的语法规则:
Type ClassName::VarName = value; //要像定义全局变量一样放在函数外
【编程实验】静态成员变量的使用 25-2.cpp
#include <stdio.h> class Test { private: static int cCount; public: Test(){cCount++;} ~Test(){--cCount;} int getCount(){return cCount;} }; //使用前必须在类外给静态成员变量分配空间 int Test::cCount = 0; //表明要在全局区,而且只能在全局区分配空间,并初始化为0 Test gTest; //cCount增加1 int main() { //int Test::cCount = 0;错误,试图在这里为静态成员分配空间 Test t1; //cCount增加1 Test t2; //cCount增加1 printf("sizeof(Test) = %d, sizeof(t1) = %d\n", sizeof(Test), sizeof(t1)); //等于1,表示cCount是在全局区分配空间, //该变量不属于某个对象本身的。 printf("count = %d\n", gTest.getCount());//3,通过对象名访问static成员变量 printf("count = %d\n", t1.getCount()); printf("count = %d\n", t2.getCount()); Test* pt = new Test(); //cCount增加1 printf("count = %d\n", pt->getCount()); //4 delete pt; //cCount减1 printf("count = %d\n", pt->getCount()); //3 //printf("count = %d\n", Test::cCount);//错误,通过类名只能访问公有的static成员变量 return 0; }
运行结果:
4. 小结
(1)类中可以通过static关键字定义静态成员变量
(2)静态成员变量隶属于类所有
(3)每一个对象都可以访问静态成员变量(可以通过类名和对象访问)
(4)静态成员变量在全局数据区分配空间
(5)静态成员变量的生命期为程序运行期