几句话总结 static 的用法。
1、静态变量
(1)静态变量统一放在特定内存区域中,在程序的整个生命周期内只有一份,所以函数在使用时共用静态变量的状态。
(2)类中的静态变量为类的所有对象共享,而且不能在类内初始化静态变量。原因:每个对象是独立的,如果可以通过对象的方式初始化静态变量,这样就代表每个对象都有一个静态变量了,这和静态变量在整个程序周期内只有一份是违背的!
正确做法是:
- 在类内声明静态变量
static int i
,在类外定义int Apple::i = 0
; - 只能用类名而不能用对象名定义:
Apple::i
是正确的而obj.i
是错误的; - 不能在主函数中定义!写在
main()
中,只能写在外层进行定义!!
(3)static可以用于限定访问范围。静态变量只在当前文件有效,即便在其他文件中进行了 extern
声明都无法使用该变量。
2、静态成员
(1)静态对象是在主函数之后被销毁的。
(2)类中的静态函数和类中的静态变量一样,由类的对象共享。虽然可以使用 obj.func()
的方式来调用静态成员函数,但还是建议使用 Apple::func()
来调用。
(3)静态成员函数仅允许直接访问静态数据成员或其他静态成员函数,无法访问类的非静态数据或函数。原因:静态成员函数的参数列表没有隐式this指针,导致没法通过 this->var
的方式访问类内的成员;而静态变量和函数的存储空间在堆中,所以这部分数据是可以直接访问的。