第4章 作用域、生命期
4.1 局部变量和全局变量
局部变量:函数内部、形参列表、某个复合语句中定义的变量。
- ① 局部变量只能在定义它的区域及其子区域中使用
- ② 在同一个区域中不能定义相同名字的变量
- ③ 在不同区域中允许定义相同名字的变量,但本质上它们是不同的变量。
- ④ 如果一个变量所处区域的子区域中有同名的变量,则该变量在子区域中无效,有效的是子区域的变量(定义屏蔽)
全局变量:函数外部定义的变量。 (少用或者不用! )
4.2 作用域
C++实体通常有三类: 变量或对象、函数、类型(结构体、共用体、类)
作用域有: 文件作用域、函数作用域、块作用域、类型声明作用域、函数原型作用域
- ① 同一个作用域内不允许有相同名字的实体,不同作用域的实体可以有相同的名字。
- ② 实体在包含它的作用域内,从定义或声明的位置开始,按文件行的顺序往后直到作用域结束均是可见的。
- ③ 若实体A在包含它的作用域内的子区域中出现了相同名字的实体B,则实体A被屏蔽。
- ④ 可以使用extern声明将变量或函数实体的可见区域往前延伸,称为前置声明。
- ⑤ 在全局作用域中,变量或函数实体若使用static修饰,则该实体对于其他源文件是屏蔽的,称为私有的(private)
4.3 生命期
C++中,每个名字都有作用域,即可以使用名字的区域,而每个对象都有生命期,即在程序执行过程中对象存在的时间。
1、动态存储: 是指在程序运行期间,系统为对象动态地分配存储空间。 动态存储的优点是对象不持久地占有存储空间,释放后让出空闲空间给其他对象的分配。
动态存储在分配和释放的形式有两种:
- 一种是由函数调用来自动完成的,称为自动存储(automatic storage)
- 另一种是由程序员通过指令的方式来人工完成的,称为自由存储(free storage)。
2、静态存储: 是指对象在整个程序运行期持久占有存储空间,其生命期与程序运行期相同。(经量少用)
3、自动对象: 默认情况下,函数或复合语句中的对象(包含形参)称为自动对象 (automatic objects),其存储方式是自动存储,程序中大多数对象是自动存储
4、寄存器变量: C++语言允许用CPU的寄存器来存放局部变量,称为寄存器变量。在局部变量前加上register存储类别修饰来定义的(加快调用速度)
5、静态局部对象: 在局部对象的前面加上static存储类别修饰用来指明对象是静态局 部对象(static local object)