标识符的作用域
一个标识符的作用域是程序中的一段区域,用于确定该标识符的可见性。当标识符在一段区域中可见时,就可以在该区域内使用此标识符。作用域有五种:
块作用域(局部作用域)
文件作用域(全局作用域)
函数原型作用域
函数作用域
类作用域
块作用域
块是函数中一对花括号(包括函数定义所使用的花括号)所括起的一段区域。在块内说明的标识符具有块作用域,它开始于标识符被说明的地方,并在标志该块结束的右花括号处结束。如果一个块内有一个嵌套块,并且该块内的一个标识符在嵌套块开始之前说明,则这个标识符的作用域包含嵌套块。函数的形参具有块作用域,其开始点在标志函数定义开始的第一个左花括号处,结束于 标志函数定义结束的右花括号处,例如:
void f( int x )
{
//形参互的作用域开始于此
int y=3; //局部变量y的作用域开始于此
{
int z=y+2;//y的作用域该嵌套块的作用域,所以y在该块内可见
//...
}
int k;//k的作用域开始于此
}
文件作用域
在函数和类之外说明的标识符具有文件作用域,其作用域从说明点开始,在文件结束处结束。 如果标识符出现在头文件的文件作用域中,则它的作用域扩展到嵌入了这个头文件的程序文件中 ,直到该程序文件结束。文件作用域包含该文件中所有的其他作用域。 在同一作用域中不能说明相同的标识符。 标识符的作用域和其可见性经常是相同的,但并非始终如此。例如:
#include <iostream.h>
int i;//文件作用域
void main()
{
i=5;
{
int i; //块作用域
i=7;
cout << "i=" << i ;// 输出7
}
cout<< "i=" << i; //输出5
}
在这个程序中,最外层的i有文件作用域,最内层的i有块作用域,最内层的i隐藏最外层的i, 这时在最内层无法存取文件作用域的i。 通过使用作用域运算符::,可以在块作用域中存取被隐藏的文件作用域中的名字,例如:
#include <iostream.h>
int i;
void main()
{
i=5;
{
int i;
i=7;
::i=1;
cout << "i=" << i ; 输出1 7
}
cout<< "i=" << i; //输出1
}
变量可以在文件作用域或块作用域中说明,在文件作用域中说明的变量称全局变量,在块作用 域中说明的变量称局部变量。函数只能在文件作用域中进行定义,但可以在文件作用域或块作用域 内进行函数说明。注意,枚举成员的作用域在括起它们的花括号之外,和枚举标记有相同的作用域。例如:
enum bool {FALSE,TRUE};
bool x=TRUE;
int FALSE; //错,与枚举常量名冲突
函数原型作用域
在函数说明的参数表中说明的标识符具有函数原型作用域,该作用域终止于函数原型说明的末尾。例如:
int sum ( int first , int second );
second=0; //错,标识符second在此不可见
函数作用域
具有函数作用域的标识符在该函数内的任何地方可见。在C++中,只有goto语句的标号具有 函数作用域。因此,标号在一个函数内必须唯一。例如,下面的程序由于在函数中说明了两个同名的标号,因而是错误的。
void f()
{
x:
cout <<"First Label";
x:
cout <<"Second Label"; // Error , duplicate label
//...
if(a>0) goto x;
}
百度的第一条记录就是了……