10.2 名字空间

虽然名字可以嵌套在类中,但全局函数、全局变量以及类的名字还是在同一个全局名字空间中。虽然static关键字可以使变量和函数实行内部连接(使它们文件静态),从而做到一定的控制。但在一个大项目中,如果对全局的名字空间缺乏控制就会引起很多问题。为了解决这些问题,开发商常常使用冗长、难懂的名字,以使冲突减少,但这样我们不得不一个一个地敲这些名字(typedef常常用来简化这些名字)。但这不是一个很好的解决方法。

可以用C++的名字空间(namespace)特征,把一个全局名字空间分成多个可管理的小空间。关键字namespace,如同class、struct、enum和union一样,把它们的成员的名字放到了不同的空间中去,尽管其他的关键字有其他的目的,但namespace惟一的目的是产生一个新的名字空间。

10.2.1 创建一个名字空间

创建一个名字空间与创建一个类非常相似:

10.2 名字空间 - 图1

这就产生了一个新的名字空间,其中包含了各种声明。然而,namespace与class、struct、union和enum有着明显的区别:

·namespace只能在全局范围内定义,但它们之间可以互相嵌套。

·在namespace定义的结尾,右花括号的后面不必跟一个分号。

·可以按类的语法来定义一个namespace,定义的内容可在多个头文件中延续,就好像重复定义这个namespace一样。

10.2 名字空间 - 图2

10.2 名字空间 - 图3

·一个namespace的名字可以用另一个名字来作它的别名,这样就不必敲打那些开发商提供的冗长的名字了。

10.2 名字空间 - 图4

·不能像类那样去创建一个名字空间的实例。

10.2.1.1 未命名的名字空间

每个翻译单元都可包含一个未命名的名字空间—可以不用标识符而只用“namespace”增加一个名字空间。

10.2 名字空间 - 图5

在这个空间中的名字自动地在翻译单元内无限制地有效。但要确保每个翻译单元只有一个未命名的名字空间。如果把一个局部名字放在一个未命名的名字空间中,不需要加上static说明就可以让它们作内部连接。

10.2.1.2 友元

可以在一个名字空间的类定义之内插入(inject)一个友元(friend)声明:

10.2 名字空间 - 图6

这样函数you()就成了名字空间Me的一个成员。