大型程序是通过模块组合构成的,在不同模块可能产生同名函数容易引发歧义,这里就引入命名空间作用域的概念,一个命名空间确定一个命名空间作用域,凡是在该命名空间之内声明的,不属于前面所描述的各个作用域的标识符,都属于该命名空间的作用域。在命名空间内部可以直接引用当前命名空间的标识符。
例如:c++中using namespace std;
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中(namespace是指标识符的各种可见范围)
作用:在使用<iostream>时,该头文件没有定义全局命名空间,必须使用namespace std,这样才能使用类似于 cout,cin 等这样的C++标识符。
c++提供using语句的两种形式
- using 命名空间名 ::标识符名;将指定的标识符暴露在当前的作用域内,使得在当前作用域可以直接引用该标识符;
- using namespace 命名空间名;将指定命名空间内的所有标识符暴露在当前的作用域内,使得在当前作用域中可以直接引用该命名空间内的任何标识符。
两种特殊的命名空间
- 全局命名空间:默认的命名空间,在显式声明的命名空间之外声明的标识符都在一个全局命名空间中。
- 匿名命名空间:一个需要显式声明的没有名字的命名空间,匿名命名空间常被用来屏蔽不希望暴露给其他源文件的标识符。
#include "Fasdsad.h"
#include <iostream>
Fasdsad::Fasdsad()
{
}
Fasdsad::~Fasdsad()
{
}
using namespace std;
int i;
int k = 100;
namespace Mode { //声明模块
int j; //Mode命名空间的全局变量;
}
int main() {
i = 5;
Mode::j = 4;
{
using namespace Mode;
int i = 2;
j = 10;
int f = 20;
cout << "i=" << i << endl; //显示i=2,说明具有局部作用域的变量可以把具有全局作用域的变量隐藏
cout << "j=" << j << endl;
cout << "k=" << k << endl; //显示k=100,全局命名空间中的变量在Mode命名空间中可以调用。
}
cout << "i=" << i << endl;
// cout << "f=" << f << endl; //加上这句报错,在Mode命名空间中的申请的变量在全局命名空间中不能够访问。
system("pause");
return 0;
}
作用域关系:命名空间作用域>类作用域>局部作用域
作用域和可见性原则不只实用于变量名,也适用于其他各种标识符,包括常量名、用户定义的类型名、函数名、及枚举类型的取值等。