2.5 命名空间
所谓命名空间,就是一个由程序设计者命名的内存区域,程序设计者可以根据需要指定一些有名字的空间域,把一些全局实体分别放在各个命名空间中,从而与其他全局实体分隔开来。
2.5.1 命名空间的意义
假设这样一种情况,当一个班上有两个名叫张三的学生时,为了明确区分他们,我们在使用名字之外,不得不使用一些额外的信息,比如他们的家庭住址,或者他们父母的名字等。
同样的情况也出现在C++应用程序中。例如,可能会写一个名为fun()的函数,在另一个可用的库中也存在一个相同的函数fun()。这样,编译器就无法判断用户所使用的是哪一个fun()函数。
因此,引入命名空间这个概念,其实是为了避免变量或函数重名的问题。因为一个项目组内多个工程师进行开发,有可能会出现全局变量或函数重名的现象,而如果每个人都定义了自己的命名空间,就可以解决这个问题,即使重名,只要分属不同的命名空间就不会出现问题。
所以,从本质上讲,命名空间就是定义了一个范围,将多个变量和函数等包含在内,使其不会与命名空间以外的任何变量和函数等发生重名的冲突。
【例2-2】编写程序,在命名空间里定义函数。
(1)在Visual Studio 2017中,新建名称为“2-2.cpp”的Project2文件。
(2)在代码编辑区域输入以下代码。
【程序分析】第一个命名空间first_name所包含的函数名为fun;第二个命名空间second_name所包含的函数名也为fun。但在主函数中调用时,编译器是许可的。
图2-2 命名空间的调用
在Visual Studio 2017中的运行结果如图2-2所示。
为了避免同名混淆,使用命名空间可以起到相互分隔的作用,把一些全局实体分隔开来。C++可以根据需要设置多个命名空间,每个命名空间名代表一个不同的命名空间域,但是不同的命名空间不能同名。
这样,可以把不同的库中的实体放到不同的命名空间中,或者说,用不同的命名空间把不同的实体隐蔽起来。过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。
2.5.2 命名空间的用法
1. namespace的声明
C++语言引入命名空间这一概念主要是为了避免命名冲突,其关键字为namespace。
为了调用带有命名空间的函数或变量,需要在前面加上命名空间的名称。
例如:
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;”
(2)不使用“using namespace std;”