命名空间 namespace
命名空间是一块程序员可以自己命名的内存区域,用于解决同名冲突的问题。
举例来说,某班及内有三个张三,分别坐在班级的第一排、第三排和最后一排。当老师喊张三时,三个张三都站起来应答,这就是同名冲突。如果老师说”第一排的张三“或者”第三排的张三“,就会有且仅有一个张三站起来应答,这里的”第一排“或者”第三排“就是所谓的命名空间。
C++中命名空间的作用类似于操作系统中的目录和文件的关系:由于文件很多,不便管理,而且容易重名,于是人们设立若干子目录,把文件分别放到不同的子目录中,同名的文件放入不同的子目录中就不会产生冲突。
使用举例如下:
#include<iostream>
namespace us1
{
int a;
}
namespace us2
{
int a;
}
using namespace us1;
int main()
{
us1::a = 5;
us2::a = 2;
std::cout <<"us1::a = " << us1::a << "\n";
std::cout <<"us2::a = " << us2::a << "\n";
std::cout << a << "\n";
}
输出如下:
us1::a = 5
us2::a = 2
5
上述代码中定义了两个命名空间,其中都含有变量 a
,当在 main
函数中使用变量 a
时,要指明使用的是哪个命名空间内的变量 a
,就如使用某一文件需要其文件路径一样,us1::a
和 us2::a
起的就是这样的作用。
另外,由于语句 using namespace us1;
的作用,使 us1
成为本程序的默认命名空间,故程序中的 a
默认为 us1::a
。
为了解决 C++ 标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突,应该将不同库的标识符在不同的命名空间中定义(或声明)。标准C++库的所有的标识符都是在一个名为 std
的命名空间中定义的,或者说标准头文件(如 iostream
)中函数、类、对象和类模板是在命名空间 std
中定义的。std
是 standard
(标准)的缩写,表示这是存放标准库的有关内容的命名空间。这样,在程序中用到C++标准库时,需要使用std作为限定。
所以每次写 C++
代码我们都会先写:
#include<iostream>
using namespace std;
而在上面的代码中,没有 using namespace std;
这一句话,所以使用输出时需要 std::cout
。