一、static的概念
在局部变量
之前加上static
,局部变量
就会变成局部静态变量
。
在全局变量
之前加上static
,全局变量
就会变成全局静态变量
。
1.1 static修饰局部变量
- 影响局部变量的
存储位置
——局部变量本身是存储在栈
上的,修饰后存储在静态存储区
,也就是data段的rw段(根据是否初始化,看看是否在bss段)。 - 影响局部变量的
生命周期
——修饰后变得跟main()函数的生命周期是一样的(跟进程一样)
- 局部变量的
作用域
变化:当局部静态变量
离开作用域后,并不会被销毁
,而是会继续留在内存
中。但是不能再对它进行访问
,除非【包含该局部静态变量
的函数再次被调用】,但是局部静态变量的值
是不会变的。
1.2 static修饰全局变量
- 影响了全局变量的
作用域
——仅限于本文件
作用域可以看作是【从
定义
之处开始,结束于文件结尾
】
- 存储在
静态存储区
,在程序运行期间
一直存在
1.3 static在类内部的表现
【static数据成员是属于类的,所以可以说它属于所有的对象
,静态成员是所有对象共享的成员
,对于多个对象来说,静态成员只存储在一处
,从而可以供所有对象共用】
- static在类内部用来实现
族类
(子类也可以共享)对象间的数据共享
生成对象
的时候,普通的数据成员才有空间
static成员在类刚声明
的时候,就已经有了空间(data rw段)
通过实例可以看到,static成员是不占用sizeof
的空间的——
二、static的初始化
必须放在类外,并且不能加static关键字
三、static数据成员属于类也属于对象,但终归属于类
- static让对象之间的数据是相通的
- 类本质上也是一个
命名空间
(小的命名空间)
标题解读:static数据成员属于类也属于对象,但终归属于类
属于
类
意味着通过类名
访问。
属于对象
意味着通过对象
访问。
终归属于类
也是意味着就算没有对象
,也可以通过类名来访问static
数据成员。
四、static修饰成员函数
- static修饰成员函数的作用只有一个——用于管理
static数据成员
- 如果数据成员都是public的,那么可以通过
对象
直接访问,但是如果是private的,那么只能通过调用成员函数
来访问。
static修饰的成员函数,既属于类,也属于对象,但终归属于类。
- 这句话也意味着,static修饰的成员函数,没有对象,也可以直接通过
类名
来访问。但是普通的成员函数
如果没有对象,是不能直接通过类名
来访问的。
【static成员函数
想要调用非静态数据成员
的时候,需要通过对象
来引用】
五、static修饰的成员函数没有this指针
- static修饰的成员函数因为
属于类
,所以没有this指针
,从而不能访问非static数据成员
以及成员函数
。
因为不知道是哪个对象的
getTower()
函数。