命名空间(英语:Namespace)表示标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。
在编程语言中,命名空间是对作用域的一种特殊的抽象,它包含了处于该作用域内的标识符,且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。许多现代编程语言都支持命名空间。在一些编程语言(例如C++和Python)中,命名空间本身的标识符也属于一个外层的命名空间,也即命名空间可以嵌套,构成一个命名空间树,树根则是无名的全局命名空间。
函数和类的作用域可被视作隐式命名空间,它们和可见性、可访问性和对象生命周期不可区分的联系在一起。
[以上摘自维基百科]
命名空间的定义
命名空间的定义跟类相似, 但不需要构造函数, 而且也没有访问限制. 下面的代码定义了一个名为hello的命名空间:
#include <iostream>
namespace hello {
using namespace std;
void greeting(){
cout << "Hello World!" << endl;
}
class Girl{
public:
static void greeting(){
cout << "Hello beautiful Girl!" << endl;
}
};
}
命名空间的使用
一般来说, 命名空间的使用有2种方式.
第一种为使用using
语句. 先使用using
语句将命名空间打开, 这样就可以直接使用函数名调用命名空间中的方法了.
int main(int argc, const char * argv[]) {
using namespace hello;
greeting();
Girl::greeting();
return 0;
}
第二种是使用作用域解析运算符::
.
int main(int argc, const char * argv[]) {
hello::greeting();
hello::Girl::greeting();
return 0;
}
命名空间的增补
在开发过程中可以给已存在的命名空间动态增加方法, 但新增加的函数不能与命名空间中已存在的函数重名.
下面的代码给上面定义的命名空间hello增加了一个函数greeting2:
namespace hello {
using namespace std;
void greeting2(){
cout << "Hello Girl!" << endl;
}
}
命名空间的重命名
如果命名空间的名字非常长, 可以使用如下语句对命名空间进行重命名:
namespace h = hello;
此时, 两个命名空间可以同时使用:
int main(int argc, const char * argv[]) {
namespace h = hello;
h::greeting();
h::greeting2();
hello::Girl::greeting();
return 0;
}