一、局部变量和全局变量
在函数内部或复合语句中定义的变量,称为局部变量(local variable)。
(1)在一个函数内部定义的变量;
(2)函数的形式参数;
(3)在某个复合语句中定义的变量。
a. 局部变量只能定义在它的区域及其子区域中使用。
b. 在同一个区域中不能定义相同名字的变量。
c. 在不同区域中允许定义相同名字的变量,但本质上它们是不同的变量。
d. 如果一个变量所处区域的子区域中有同名的变量,则该变量在子区域无效,有效的是子区域的变量,称为定义屏蔽。
在源文件中,但在函数外部定义的变量,称为全局变量(global variable),全局变量的有效区域是从定义变量的位置开始到源文件结束。
函数之间数据传递尽量可以利用全局变量,如此也会导致两个函数彼此分不开,违背模块化的原则,因此结构化程序设计提倡少用或不用全局变量。
二、作用域
C++的实体通常有三类:(1)变量或对象;(2)函数;(3)类型。
作用域是程序中的一段区域。在同一个作用域上,C++程序中每个名字都与唯一的实体对应;如果在不同的作用域上,程序中可以多次使用同一个名字,对应不同作用域中的不同实体。
(1)文件作用域;(2)函数作用域;(3)块作用域;(4)类型声明作用域;(5)函数原型作用域。
实体在作用域内可以使用称为可见(visible),又称有效。可见的含义是指实体在作用域上可以使用。
规则一:同一个作用域内不允许有相同名字的实体,不同作用域的实体可以有相同名字。
规则二:实体在包含它的作用域内,从定义或声明的位置开始,按文件行的顺序往后(往下)直到该作用域结束均是可见的,包含作用域内的所有子区域及其嵌套。
规则三:若实体A在包含它的作用域内的子区域中出现了相同名字的实体B,则实体A被屏蔽。
规则四:可以使用extern声明将变量或函数实体的可见区域往前延伸,称为前置声明(forward declaration)。
规则五:在全局作用域中,变量或函数实体若使用static修饰,则该实体对于其他源文件是屏蔽的,称为私有的(private)。