一. 静态成员变量的本质
- 静态成员变量本质上是全局变量,哪怕一个对象都不存在,类的静态成员变量也存在。
- 静态成员函数本质上是全局函数。
二. 为什么要使用 静态成员函数、成员变量
-
节省内存
静态成员是类的所有对象共享的,而不是某个对象的成员; 对多个对象来说,静态数据成员只存储一处。
-
节省时间
静态数据成员的值对每个对象都是一样,但它的值是可以更新的。只要对静态数据成员的值更新一次,即全部被更新。
-
不需要实例化即可被访问、调用
三. 为什么静态成员函数不能访问非静态成员变量
- 静态成员函数在类加载时就分配内存,而非静态成员函数只有在实例化后才存在;使用静态函数访问非静态成员变量相当于在当问一个不存在的变量--> 报错
- 成员函数调用时,编译器都会传入一个this指针指向对象,但静态成员函数先于对象实例化存在,不属于对象,无法提供this指针。
四. 为什么静态成员变量必须类外初始化
- 因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,每次创建对象的时候都初始化一次
- 类外定义和初始化是保证static成员变量只被定义一次的好方法