标识符的作用域
标识符的作用域是指某种标识符的作用范围。在C++中出现的各种标识符,具有不同的作用域。
作用域规则
总体规则:标识符只能在说明它或定义它的范围内是可见的,而在该范围之外是不可见的。
解释:
标识符包含常量名,变量名,函数名,类名,对象名,语句标号,类型定义名,宏名等。所谓可见是指可以对所定义的标识符进行访问存取等操作。
作用域种类
按作用域的大小可以分为以下5种:
程序级>文件级>类级>函数级>块级
1.程序级的作用域最大,包括组成该程序的多个文件,属于程序级作用域的有外部对象或变量和外部函数,在定义它的整个程序中都是可见的;
2.属于文件级作用域的有内部函数和外部静态变量或对象。这种作用域的范围是在定义它的文件内,从定义时开始到文件结束。宏名作用范围也是文件级,从定义开始一直到文件结束(或者出现了undef取消定义);
3.类级作用域通常在类体内,类中私有成员作用范围在类体内,公有成员类体外也可见。类的对象的作用域要看其定义范围;
4函数级作用域是在该函数的函数体内,包含形参,函数体内定义的某些自动类变量或对象、内部静态类变量或对象及其语句标号。注意作用域不包含在函数体内的分程序中,或if语句和switch语句以及循环体中定义的变量或对象。
5块作用域包含那些定义在分程序中,或if语句和switch语句以及循环体中定义的变量或对象。作用范围仅在它的相应范围内。
关于重新定义标识符的作用域
一般在相同作用域内,变量和函数是不能重复定义的。在不同的作用域内,可以定义同名变量或函数。
重新定义的标识符作用域规定:在某个作用范围内,定义的标识符可以在该范围内的子范围中重新定义该标识符,这时原定义的标志符在子范围内是不可见的,但它仍然是存在的。当退出子范围后,它又是可见的。而在其子范围内,重新定义的标识符是可见的,一旦退出了该子范围,重新定义的标识符不可见。
例1:
#include <iostream>
using namespace std;
int main()
{
int x(7), y(9), z(11);
cout << "x=" << x << ",y=" << y << ",z=" << z << endl;
{
double z = 5.67;