文档介绍:第5章程序结构
作用域与可见性
生存期
局部变量和全局变量
静态成员
友元
常类型
多文件结构
编译预处理
作用域与可见性
作用域
作用域是一个标识符在程序正文中有效的区域。C++的作用域有函数原型作用域、块作用域(亦称局部作用域)和文件作用域。
1. 函数原型作用域
函数原型作用域是C++程序中最小的作用域。前面介绍过,在函数原型的声明中一定要包含参数的类型声明。
这里参数的声明就属于函数原型作用域,它开始于函数原型声明的左括号“(”,结束于右括号“)”。例如,有如下函数声明:
double Area(double length,double width);
由于形参length和width只在括号之内有效,在程序的其它地方无法引用这个标识符,如果要引用,必须重新定义。例如:
double Area(double length,double width); //函数声明
length=10;
width=5;
这段代码会引起无定义的标识符编译错误。所以,对于这种情况,标识符length和width实际上是可有可无的,省去它,也决不会影响到程序的编译和运行结果。例如:
double Area(double,double);
但是,考虑到程序的可读性,还是要在函数原型声明时,给形参指定一个有意义的标识符,而且一般总是与该函数定义时声明的参数标识符一致。
例如:
double Area(double length,double width); //函数声明
//...
double Area(double length,double width) //函数定义
{
//...
}
块作用域又称局部作用域。当标识符的声明出现在由一对花括号“{}”所括起来的程序(块)内时,则此块中声明的标识符的作用域从声明处开始,一直到块结束的花括号为止。为了理解块作用域,我们来看一个例子:
#include<>
void main( )
{
int n;
for(int i=0;i<5;i++)
{
int m;
if(i%2) m作用域 i作用域 n作用域
n++;
}
m=n/2; //错误,m未定义
n=i;
}
在这个例子中,函数体main( )是一个块,for语句之后的循环体又是一个较小的块。变量n和i的作用域从声明处开始,到它所在的块,即整个函数体main( )结束处为止。变量m的作用域从声明处开始到它所在的块,即循环体结束为止。因此,编译时m=n/2会出错,因为它试图在m作用域之外引用m。而n=i是允许的,因为此时还在i的作用域内。如果在上面的程序中加入一个函数fun1( ),情况会怎么样呢?
#include<>
void main( )
{
void fun1( ); //fun1( )函数声明
int n;
for(int i=0;i<5;i++)
{
int m;
if(i%2)
n++;
}
m=n/2; //错误,m未定义
fun1( ); //fun1( )函数调用
n=i;
}
void fun1( )
{
cout<<"i="<<i<<endl; //错误,i未定义
}