static关键字在C++类中的使用
一. 静态成员变量
我们现象一个现实生活中的场景,班里一共有20个同学,假如今天班里来了个新同学,班里的每个同学其实都是知道当前学生一共21人,问班长,班长知道,问副班长,副班长知道
抽象成代码,怎么在类内定义一个成员变量,来记录当前这个类对象的个数?即每个对象可见的一个成员变量
回顾C语言中,哪个关键字可以延长变量的生命周期,将变量从栈区移到静态存储区
static
1.1 静态成员变量
- 静态成员变量属于整个类所有
- 静态成员变量的生命期不依赖于任何对象
- 可以通过类名直接访问共有静态成员变量
- 所有对象共享类的静态成员变量
- 可以通过对象名访问共有静态成员变量
1.2 静态成员变量特性
-
在定义时直接通过static关键字修饰
-
静态成员变量需要在类外单独分配空间
-
静态成员变量在程序内部位于全局数据区
-
语法规则
#include<iostream> using namespace std; class Student { public: static int stuCount; Student() { stuCount++; } ~Student() { --stuCount; } int getStuCount() { return stuCount; } }; int Student::stuCount = 0; int main(int argc, const char *argv[]) { Student Hua; cout << "Hua:81 class has " << Hua.stuCount << " students" << endl; Student Qing; Student Yuan; Student Jian; cout << "81 class has " << Qing.stuCount << " students" << endl; Student *sp = new Student; cout << "81 class has " << Yuan.stuCount << " students" << endl; delete sp; cout << "81 class has " << Student::stuCount << " students" << endl; return 0; }
1.3 总结
- 类中可以通过static关键字定义静态成员变量
- 静态成员变量隶属于类所有
- 每一个对象都可以访问静态成员变量
- 静态成员变量在全局数据区分配空间
- 静态成员变量的生命期为程序运行期
- 对于静态成员的访问,可以通过类名加作用域限定符的方式进行访问。
- 静态成员变量的访问也受类中访问控制属性的限制。
二. 静态成员函数
回顾static关键字的作用,可以修饰全局变量,局部变量,函数,
实际生活中,老师了解一个班学生的数量时,不用只通过问本班学生了解,假如学生在上课,班主任需要了解学生个数怎么办。
即不依赖对象也可以访问到类中的静态成员变量
2.1 需求
- 系统在程序运行期间某个类的对象数目
- 保证程序的安全性(不能使用全局变量)
- 随时可以获取当前对象的数目
2.2 分析
- 不依赖对象就可以访问静态成员变量
- 必须保证静态成员变量的安全性
- 方便快捷的获取静态成员变量的值
2.3 静态成员函数
-
静态成员函数是类中特殊的成员函数
-
静态成员函数属于整个类所有
-
可以通过类名直接访问公有静态成员函数
-
可以通过对象名访问公有静态成员函数
定义方式:#include<iostream> using namespace std; class Student { public: static int stuCount; Student() { stuCount++; } ~Student() { --stuCount; } //直接使用static修饰函数 static int getStuCount() { return stuCount; } }; int Student::stuCount = 0; int main(int argc, const char *argv[]) { Student Hua; cout << "Hua:81 class has " << Hua.stuCount <<" students" << endl; Student Qing; cout << "Qing:81 class has " << Qing.stuCount << " students" << endl; Student *Yuan = new Student; cout << "YUan:81 class has " << Yuan->stuCount << " students" << endl; delete Yuan; cout << "81 class has " << Student::getStuCount() << " Students" << endl; return 0; }
2.4 注意
- 对于静态成员函数的访问(成员函数必须是public的属性)
类名::静态成员函数函数名(实参表);
对象名.静态成员函数函数名(实参表);
对象名->静态成员函数函数名(实参表); - 静态成员函数,形参表中没有隐藏的this指针,
静态成员函数不能是常函数。 - 静态成员函数只能访问静态成员变量,不可以访问非静态成员变量;
非静态成员函数既可以访问静态成员变量,也可以访问非静态成员变量。