0、序言
名字空间是C++提供的一种解决符号名字冲突的方法。
一个命令空间是一个作用域,在不同名字空间中命名相同的符号代表不同的实体。
通常,利用定义名字空间的办法,可以使模块划分更加方便,减少模块间的相互影响。
1、名字空间的成员
定义在名字空间中的实体称为名字空间的成员。
名字空间内的名字可以被该名字空间内的其他成员直接访问,名字空间外的代码必须指定该名字位于哪个名字空间。
一个名字空间可以包含多种类型的标识符,如下面所列:
变量、常量、函数、结构体/联合体/枚举、类、嵌套名字空间
名字空间成员的引用方法如下:
namespace_name::member_name
2、定义名字空间
(1)、一个名字空间可以在两个地方被定义:在全局范围层次或者是在另一个名字空间中被定义(这样就形成一个嵌套名字空间),不能在函数和类的内部定义。
(2)、名字空间可以是不连续的,他是由所有分离定义的部分的总体构成的。一个名字空间可以分散多个文件中,不同的文件中名字空间的定义也是累积的。
通常将名字空间的声明放到头文件中,实现放到源文件中。可以将不相关的成员放到不同的头文件中。
(3)、命令空间的作用域不能以分号结尾。
3、嵌套名字空间(Nested Namespce)
3.1、普通嵌套名字空间(ordinary nested namespace)
一个嵌套名字空间就是一个嵌套作用域,其作用域嵌套在包含他的名字空间中。
在外部引用嵌套空间中的成员时,使用下面的形式
包含嵌套空间的名字空间的名字::嵌套空间的名字::嵌套空间的成员
下面举例说明嵌套名字空间定义和使用
#include <iostream> namespace MyOutNames { int iVal1 = 100; int iVal2 = 200; namespace MyInnerNames //定义嵌套名字空间 { int iVal3 = 300; int iVal4 = 400; } } int main(void) { std::cout<<MyOutNames::iVal1<<std::endl; std::cout<<MyOutNames::iVal2<<std::endl; std::cout<<MyOutNames::MyInnerNames::iVal3<<std::endl; //使用嵌套名字空间成员 std::cout<<MyOutNames::MyInnerNames::iVal4<<std::endl; //使用嵌套名字空间成员 return 0; } |