作用域,顾名思义,就是指某个标识符在程序中的有效区域。
在C++中,按作用域的大小,一般可分为局部作用域和全局作用域。
1.局部作用域
局部作用域用大括号,即{},来定义,大括号括起来的范围就是一个局部作用域。局部作用域内,一个变量或者函数的有效位置是从其声明开始一直到该局部作用域结束。
局部作用域里面还可以继续嵌套更小的局部作用域,可称之为子作用域。子作用域比父作用域拥有更高的优先级,也就是说父作用域中的变量在子作用域中任然是有效的,但是子作用域的变量就没法在父作用域里用了。
常见的局部作用域有函数体、if-else、while、for、switch等,仔细回想一下,这些复合语句后面是不是都跟着一个{},这就是它们的局部作用域啦~
当然,我们并不只有在以上说的这些复合语句后才能用{}定义局部作用域,我们可以任性地在程序中任何你想要的地方定义,举个例子:
#include "stdafx.h"
#include <iostream>
int _tmain(int argc, _TCHAR* argv[])
{
int nInt = 0;
//在此定义一个局部作用域
{
int nInt = 1; //该变量只在局部作用域中才有效
cout << "在局部作用域里,nInt = " << nInt << endl;
}
cout << "在局部作用域外,nInt = " << nInt << endl;
return 0;
}
运行得到的结果如下:
2.全局作用域
如果变量或函数不在任何局部作用域内,那么就说它在全局作用域内,也就是我们常说的全局变量或全局函数。
全局作用域的范围,从变量或函数声明的位置开始,一直到整个源文件结束,一定要注意是整个当前的源文件哦。比如下面这段代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
int nGlobal; //全局变量
//全局函数
int Add(int a, int b)
{
return a + b;
}
int _tmain(int argc, _TCHAR* argv[])
{
nGlobal = Add(1, 2);
cout << "全局变量nGlobal = " << nGlobal<<endl;
return 0;
}
运行结果为:
3.extern关键字
由于全局作用域的范围只在当前的源文件中,由于C++程序往往会有多个源文件组成,那么如果我们想要引用一个其他源文件中的变量或函数又该怎么办呢?这就要用到extern关键字了。
用“extern”关键字可以找到定义在其他源文件中的全局变量,只要在当前源文件中声明该变量或函数时,加上extern关键字修饰就行了。当加上了extern关键字后,就表示这是一个扩展的声明,编译器就会在其他的源文件中查找这个变量或者函数的具体定义了。如下例所示:
首先在另外的源文件,如stdafx.cpp中定义了一个全局变量nGlobal和函数Add:
int Add(int a, int b)
{
return a + b;
}
int nGlobal;
然后在当前的源文件main.cpp中用如下的方式引用在stdafx.app中定义的全局变量,如下所示:
#include "stdafx.h"
#include <iostream>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
extern int Add(int a, int b);
extern int nGlobal;
nGlobal = Add(1, 2);
cout << "在main中引用nGlobal结果为"<<nGlobal << endl;
return 0;
}
运行得到结果:
由此,我们就可以实现多个源文件之间共享全局变量和全局函数了~