![C++ 从入门到项目实践(超值版)](https://wfqqreader-1252317822.image.myqcloud.com/cover/805/26846805/b_26846805.jpg)
2.5 命名空间
所谓命名空间,就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。
2.5.1 命名空间的意义
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P31_5916.jpg?sign=1738856678-WlQM5CeyVgTuMNvynM0h9pUbxbyEBZHx-0-82cbc366f59a60ae06c425e6c0384038)
假设这样一种情况,当一个班上有两个名叫张三的学生时,为了明确区分他们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等。
同样的情况也出现在C++应用程序中。例如,可能会写一个名为fun()的函数,在另一个可用的库中也存在一个相同的函数fun()。这样,编译器就无法判断用户所使用的是哪一个fun()函数。
因此,引入命名空间这个概念,其实是为了避免变量或函数重名的问题。因为一个项目组内多个工程师进行开发,有可能会出现全局变量或函数重名的现象,而如果每个人都定义了自己的命名空间,就可以解决这个问题,即使重名,只要分属不同的命名空间就不会出现问题。
所以,从本质上讲,命名空间就是定义了一个范围,将多个变量和函数等包含在内,使其不会与命名空间以外的任何变量和函数等发生重名的冲突。
【例2-2】编写程序,在命名空间里定义函数。
(1)在Visual Studio 2017中,新建名称为“2-2.cpp”的Project2文件。
(2)在代码编辑区域输入以下代码。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P32_6090.jpg?sign=1738856678-N4Jl5gYc7W3fNimNBz2JNgJcbZEViC9W-0-ab1bd052432b0ed7e7492799c01a389c)
【程序分析】第一个命名空间first_name所包含的函数名为fun;第二个命名空间second_name所包含的函数名也为fun。但在主函数中调用时,编译器是许可的。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P32_6086.jpg?sign=1738856678-YJgbk4a9MiZfa2U8jQVdAeyWn16VXHyM-0-bb15ad632e88ada17e50c3ea61cbc298)
图2-2 命名空间的调用
在Visual Studio 2017中的运行结果如图2-2所示。
为了避免同名混淆,使用命名空间可以起到相互分隔的作用,把一些全局实体分隔开来。C++可以根据需要设置多个命名空间,每个命名空间名代表一个不同的命名空间域,但是不同的命名空间不能同名。
这样,可以把不同的库中的实体放到不同的命名空间中,或者说,用不同的命名空间把不同的实体隐蔽起来。过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。
2.5.2 命名空间的用法
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P32_6089.jpg?sign=1738856678-88F07M1fCLAzetaaok5yl1W1zS5nvblE-0-d9d42bb20af38f16f39e93126e319aff)
1. namespace的声明
C++语言引入命名空间这一概念主要是为了避免命名冲突,其关键字为namespace。
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P32_6091.jpg?sign=1738856678-SMpBuMDd327RKzxdivDi5R5rXW5TGeLQ-0-0cfcf3e8cbeb66ce96aeb5a18ccb8a6d)
为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称。
例如:
first_name::fun(); //也可以是变量
注意:指定所使用的变量时需要用到“::”操作符,“::”操作符是域解析操作符。
2. std标准命名空间
标准C++库的所有的标识符都是在一个名为std的命名空间中定义的。std是一个类(输入输出标准),它包括了cin成员和cout成员,执行“using namespace std ;”语句后才能使用它的成员。
而#include<iostream>包含了std这个类。在类的使用之前需要预处理一下,代码才可以使用cin,cout这两个成员函数。如果不使用预处理“using namespace std;”,需要加上std::cin或者std::cout再去使用它的成员函数。
std是standard(标准)的缩写,表示这是存放标准库的有关内容的命名空间,含义清楚,不必死记。这样,在程序中用到C++标准库时,需要使用std作为限定。
(1)使用“using namespace std;”
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P33_6231.jpg?sign=1738856678-uFUMpyqh7Jds8N49YH5RnwT90xObvg2f-0-42aca44a1e44d0d3243b99a7925b6c1c)
(2)不使用“using namespace std;”
![](https://epubservercos.yuewen.com/F7D2C7/15289822205524706/epubprivate/OEBPS/Images/Figure-P33_6232.jpg?sign=1738856678-6jKQhYWGjraVem91EzgmBp8manY8QA7j-0-c0ce24a2f813382264b3b1dabd898ae8)