作用:缓解名字污染。
访问名字空间内成员、类的三种方式:
1、名字空间别名
namespace International_Business_Machines
{
int a;
....
}
//别名
namespace IBM = International_Business_Machines
IBM::a = 100;
以关键字namespace开头,且最后没有“;”号。
2、using声明
用法using 空间名::成员。
作用:让空间名中的某成员可见。
using 声明引入的名字有以下特性:
1)它在该域中必须惟一
2)由外围域中的声明引入的相同名字被其隐藏
3)它被嵌套域中的相同名字的声明隐藏
如:
namespace blip
{
int bi = 16, bj = 15, bk = 23;
// 其他声明
}
int bj = 0;
void manip()
{
using blip::bi; // 函数 manip() 中的 bi 指向 blip::bi
++bi; // 设置 blip::bi 为 17
using blip::bj; // 隐藏全局域中的 bj
// 在函数 manip() 中的bj 指向 blip::bj
++bj; // 设置 blip::bj 为 16
int bk; // bk 在局部域中声明
using blip::bk; // 错误: 在 manip() 中重复定义 bk
}
int wrongInit = bk; // 错误: bk 在这里不可见应该用 blip::bk
3、using指示符
用法using namespace 空间名
作用:让空间名内的成员都可见。
using 指示符使名字空间成员名可见就好像它们是在名字空间被定义的地方之外被声明的一样。如:
namespace blip
{
int bi = 16, bj = 15, bk = 23;
// 其他声明
}
int bj = 0;
void manip()
{
using namespace blip; // using 指示符 -
// ::bj 和 blip::bj 之间的冲突只在bj 被使用时才被检测到
++bi; // 设置 blip::bi 为 17
++bj; // 错误: 二义性
// 全局 bj 还是 blip::bj?
++::bj; // ok: 设置全局 bj 为 1
++blip::bj; // ok: 设置 blip::bj 为 16
int bk = 97; // 局部 bk 隐藏 blip::bk
++bk; // 设置局部 bk 为 98
}
最后,说下未命名的名字空间的作用,成员相当于被static修示,只在本文件内可见,其他文件访问不到。