作用域的种类可分为五种,从大到小分别为:程序级>文件级>类级>函数级>块级
作用域 |
标识符
| 举例 | 注释 |
程序级 | 外部变量,外部对象和外部函数 (外部函数一般指的是带extern限定符的函数,一般函数默认extern,之所以叫外部函数,是指该函数可以在该文件外被其他文件的函数所调用) | ******file1.cpp****** int a=0; void fn1(); void main (){ // to do } ******file2.cpp****** void fn2(){ a=1; fn1(); } |
一个程序可以有多个文件,那么程序级的作用域可以被多个文件所引用
// a为外部变量,fn1为外部函数,作用域均为程序级
|
文件级 | 外部静态变量,外部静态对象和内部函数,宏 (内部函数即是静态函数,之所以叫内部函数,是指该函数只可以在该文件内被其它函数所调用) | ******file1.cpp****** #define MAX(a,b) ((a)>(b))?a:b int static a; static void fn1(); void fn3(); void main (){ // to do } static void fn1(){ // to do } void fn3(){ fn1(); } ******file2.cpp****** void fn2(){ MAX(1,2); a=1; fn1(); fn3(); } | // 宏定义的MAX(a,b)作用域为文件级 // a为外部静态变量,fn1()为内部函数(静态函数),作用域均为文件级 //fn3()为外部函数,作用域为程序级 //通过fn3调用fn1(); // MAX()的作用域为文件级,不可以在file2.cpp中被引用 // error: a的作用域为文件级(file1.cpp),那么在文件file2.cpp中不可以被引用,同理fn1也不可以。 // 正确:fn3()作用域为程序级,可以再这里被引用,这时候通过fn3()调用了文件级的fn1()也是可以的。 |
类级 | 类中私有成员 | ******file1.cpp****** public class C1{ private int a; } C1 c1= new C1(); c1.a=1; | // a为类C1私有成员,作用域仅仅限于类C1中,为类级 // a的作用域为类级,在这里不可以被引用 |
函数级 | 形参,函数体内定义的某些自动类变量或对象,内部静态变量或内部静态对象,语句标号 | void fn(int x){ int y; } | // x的作用域开始 // y的作用于开始 // x,y的作用域结束
|
块级 | 分程序,if语句,switch语句,循环语句中的自动类和内部静态变量或对象。 | void fn(){ if(int i=5){ // to do } else{} cout << i <<endl; } void fn(int n){ if(n>5){ int i=n; } else{ double i=n; } } void fn(){ switch(int i=fn1()){ case 1: cout<< i ; case 2: ..... } cout << i<<endl; } | // i的作用于开始 // i的作用域结束
// int型 i 的作用域在此开始,到此结束 // double型 i 的作用域在此开始,到此结束 // i的作用于开始
// i的作用域结束
|