8.7 名字空间
在函数中我们用程序块来组织代码(8.4节)。我们用类来将函数、数据和类型组织到一个类型中(第9章)。函数和类都为我们做了如下工作:
·允许我们定义大量实体,而无须担心它们的名字与程序中其他实体的名字冲突。
·为我们提供了一个名字,用来访问我们定义的东西。
至此,我们还缺少一种技术,即无须定义一个类型就能将类、函数、数据和类型组织成一个可识别的命名实体。实现这种声明分组功能的C++机制就是名字空间(namespace)。例如,我们希望提供一个包含类Color、Shape、Line、Function和Text的绘图库(参见第18章):
很可能其他人也使用了这些名字,但没有关系。你可以定义名为Text的实体,但与我们的Text没有冲突。Graph_lib::Text是我们定义的类,而你的Text与之不同。唯一可能有问题的情况就是,你也定义了一个名为Graph_lib的类或者名字空间,它也包含一个名为Text的成员。Graph_lib这个名字有点丑,我们选择它的原因是,“漂亮且清晰”的名字Graphics有很大可能已经被别人用过了。
假设你的Text是一个文字处理库的一部分。我们用来将绘图功能组织到名字空间Graph_lib中的思想,也可用来将你的文字处理功能组织到一个叫其他名字(比如TextLib)的名字空间:
如果定义的这两个名字空间都是全局的,我们可能会陷入真正的麻烦之中。假使有人同时使用这两个库,就可能真的遇到名字冲突,如Text和Line。糟糕的是,如果这两个库都有用户在使用,我们就无法通过修改Line、Text这些名字来避免冲突,否则用户程序也必须修改。为了解决这一问题,我们可以使用名字空间,即我们的Text用Graph_lib::Text表示,你的Text用TextLib::Text。这种由一个名字空间的名字(或一个类名)和一个成员名组合成的名字称为全限定名(fully ...
