变量
局部变量
-
在函数内部或复合语句中(区域)定义的变量,称为局部变量,又称为内部变量
-
函数内部定义的变量、函数的形式参数、某个语句中定义的变量都是局部变量
-
局部变量只能在定义区域和其子区域中使用
-
在同一个区域中不能定义相同名字的变量
-
在不同区域中允许定义相同名字的变量,但本质上他们是不同的变量
-
如果一个变量所处区域的子区域中有同名的变量,则该变量在子区域内无效,有效的是子区域的变量,称为定义屏蔽
全局变量
-
在函数外部定义的变量,称为全局变量
-
全局变量的有效区域是从定义变量的位置开始到源文件结束,在整个项目工程下都可用
-
提倡少用或不用全局变量
作用域
-
c++的实体有三类:
- 变量或对象(变量、数组)
- 函数
- 类型(结构体类型、共用体类型、类类型)
-
作用域是程序中的一段区域,在同一个作用域上,一个名字只能与唯一实体相对应;在不同作用域上,一个名字可以与不同作用域中的不同实体相对应
-
作用域有:
- 文件作用域
- 函数作用域
- 块作用域
- 类型声明作用域
- 函数原型作用域
-
实体在作用域内可以使用称为可见,又称有效
-
可见规则:
- 同一个作用域内不允许有相同名字的实体,不同作用域可以有相同名字
- 实体在包含它的作用域内,从定义或声明的位置开始,按文件行的顺序往下直到该作用域结束均是可见的,包含作用域内所有子区域及其嵌套
- 若实体A在包含它的作用域内的子区域中出现了相同的实体B,则实体A被屏蔽
- 可以使用extern声明将变量或函数实体的可见区域往前延伸,称为前置声明,也可扩展到同个项目工程下的其他文件
extern 类型 变量名,··· extern 返回类型 函数名(类型1 参数名1,···) extern 返回类型 函数名(类型1,···) - 在全局作用域中,变量或函数实体若使用static修饰,则该实体对于其他源文件是屏蔽的,称为私有的
static 类型 变量名,··· static 返回类型 函数名(类型1 参数名1,···) static 返回类型 函数名(类型1,···)
生命期
-
每个名字都有作用域,即可以使用名字的区域,而每个对象都有生命期,即程序执行过程中对象存在的时间
-
动态存储是指在程序运行期间,系统为对象动态地分配存储空间,动态存储的存储空间的分配和释放是动态的,生命期是整个程序运行的一部分,它的对象不持久地占有存储空间
-
动态存储在分配和释放的形式有两种:
- 由函数调用来自动完成的,称为自动存储
- 由指令方式人工完成的,称为自由存储
-
静态存储是指对象在整个程序运行期持久占有存储空间,其生命期与程序运行期相同
-
静态存储的对象数据可以在程序运行期始终保持直到修改为止,或者程序结束为止,静态存储的分配和释放在编译完成时就决定好了
-
尽量少用静态存储
-
自动对象:默认情况下,函数或复合语句中的对象(包含形参)称为自动对象,存储方式是自动存储
(auto) 类型 变量名,······
-
寄存器变量:用CPU的寄存器来存放局部变量,称为寄存器变量
register 类型 变量名,······
-
静态局部对象:在局部变量前面加上static存储类别修饰用来指明对象是静态局部对象,静态局部变量会保留其值,属于静态存储
static 类型 变量名,······
-
函数本质上是全局(外部)的,在函数前面加上static修饰使其称为内部函数,加上extern修饰即为外部函数,extern可以省略