“作用域”指标识符能够被使用的范围。只有在作用域内标识符才可以被访问(称为“可见”)。本节只讨论局部域和文件域(全局域),其中局部域包括块域和函数原型域。
任何标识符作用域的起始点均为标识符说明处。
块作用域
“块”指一对大括号括起来的程序段。块中定义的标识符,作用域在块内。
- 复合语句是一个块。复合语句中定义的标识符,作用域仅在该复合语句中。
- 函数也是一个块。函数中定义的标识符,包括形参和函数体中定义的局部变量,作用域都在该函数内,也称作“函数域”。
举例:【例3.7】 输入两数,将两数按从大到小的顺序保存,并输出结果。(查看动画演示)
#include<iostream>
using namespace std;
int main(){
int a,b; //函数内定义局部变量,具有函数域
cout<<"输入两整数:"<<endl;
cin>>a>>b;
cout<<"a="<<a<<'/t'<<"b="<<b<<endl;
if(b>=a){ //使a中保存大数,b中保存小数
int t; //块中定义局部变量,具有块作用域
t=a; a=b; b=t; //交换a,b的值
}
cout<<"a="<<a<<'/t'<<"b="<<b<<endl;
return 0;
}
举例:【例3.9】 显示同名变量可见性的例子。(查看动画演示)
#include<iostream>
using namespace std;
int n=100;
int main(){
int i=200,j=300;
cout<< n<<'/t'<<i<<'/t'<<j<<endl;{ //输出全局变量n和外层局部变量i,j
int i=500,j=600,n; //内层块
n=i+j;
cout<< n<<'/t'<<i<<'/t'<<j<< endl; //输出内层局部变量n和i,j
cout<<::n<<endl; //输出全局变量n
}
n=i+j; //修改全局变量
cout<< n<<'/t'<<i<<'/t'<<j<< endl; //输出全局变量n和外层局部变量i,j
return 0;
}
函数原型作用域
函数原型不是定义函数。在作函数原型声明时,其中的形参作用域只在原型声明中,即作用域结束于右括号。正是由于形参不能被程序的其他地方引用,所以通常只要声明形参个数和类型,形参名可省略。
#include<iostream.h>
void swap(int,int);//函数原型作用域
void main(){
……
}
文件作用域
文件作用域也称“全局作用域”。
- 定义在所有函数之外的标识符,具有文件作用域,作用域为从定义处到整个源文件结束。
- 文件中定义的全局变量和函数都具有文件作用域。
- 如果某个文件中说明了具有文件作用域的标识符,该文件又被另一个文件包含,则该标识符的作用域延伸到新的文件中。如cin和cout是在头文件iostream.h中说明的具有文件作用域的标识符,它们的作用域也延伸到嵌入iostream.h的文件中。