6.8 作用域与可见域
在函数一节,讨论形参变量时曾经提过形参变量只在被调用期间才分配内存单元,调用结束则立即释放。这表明形参变量只存活在函数内,只有在函数内才有效,只有在函数内才能使用该变量。程序流程离开该函数后,该变量便不复存在、不再有效、不能再使用了。这3条规则分别对应着变量的生存期、作用域和可见域。
通俗地讲,生存期指的是在程序运行过程中,变量从创建到撤销的一段时间。生存期的长短取决于前面所讲的存储方式,对于自动分配(栈分配),变量与其所在的代码块共存亡;对于静态分配(编译器预分配),变量与程序共存亡,程序开始执行时即已存在,一直到程序运行完毕退出后才撤销。对于动态存储的内存块(不是指向该内存块的指针),由程序员决定其生存期。
在程序代码中,变量有效的范围(源程序区域)称为作用域,能对变量、标识符进行合法的访问的范围(源代码区域)称为可见域。变量有效的前提是变量存在于内存中,实际上,变量的作用域和生存期一样,都取决于存储方式,可见域是作用域的子集。
6.8.1 作用域
严格地说,作用域是程序正文代码(不包括注释等)中的一片区域,在这块区域内,标识符理论上(排除下面要介绍的屏蔽情况)指向同一内存单元,可以将C++作用域分为以下4类。
1.块作用域
自动变量(auto、register)和内部静态变量(static)具有块作用域,在一个块内声明的变量,其作用域从声明点开始,到该块结束为止。函数定义中声明的形参,其作用域限定在该函数体内,与其他函数中声明的同名变量不是一回事,允许在不同的函数中使用相同的变量名,编译器将为这些变量分配不同的存储单元,不会混淆。
注意
强调goto语句,在本函数内给出的标号,不管在任何位置,都可使用goto语句将程序流程转到标号处,但是C++不允许使用goto语句将流程转到别的函数中。
2.文件作用域
外部静态变量(static)具有文件作用域,从声明点开始到文件末尾,此处所指的文件是编译基本单位—cpp文件。
3.全局(程序)作用域
全局变量(extern)具有全局作用域,只要在使用前对其进行声明,便可在程序(由若干个文件组成)的任意位置使用全局变量。
4.类作用域
这将在介绍了类的概念后详细介绍。