1.名字空间
1.为什么需要名字空间?
1)划分逻辑单元,改善程序的可读性和可维护性。
2)避免名字冲突。
2.什么是名字空间?
1)定义
namespace 名字空间名 { ... }
2)合并
同名名字空间,无论是在一个源文件中,还是分布于不同的源文件中,编译器都会把它们合并到一个名字空间中。
3)声明和定义可以分开
定义语句必须带有作用域限定。
namespace ns {
extern int x;
void foo (void);
}
int ns::x = 100;
void ns::foo (void) { ... }
3.怎样使用名字空间
1)作用域限定符
cout << ns::x << endl;
ns::foo ();
2)名字空间指令
using namespace ns; // 使ns中的标识符在以下代码中可见
cout << x << endl;
foo ();
只有在不发生名字冲突的前提下,才可以使用这种语法。
3)名字空间声明
using ns::x; // 将ns中的x引入当前作用域中
cout << x << endl;
只有在不发生名字冲突的前提下,才可以使用这种语法。
4.无名(匿名)名字空间
1)不属于任何有名名字空间的标识符,会被编译器自动地放入一个无名名字空间中。
2)对无名名字空间成员的访问:直接在该成员名前面使用“::”。
5.名字空间嵌套和别名
1)多层名字空间
namespace ns1 {
namespace ns2 {
namespace ns3 {
int x;
void foo (void) { ... }
}
}
}
2)访问内层名字空间的成员
cout << ns1::ns2::ns3::x << endl;
using namespace ns1::ns2::ns3;
foo ();
3)名字空间别名
namespace ns123 = ns1::ns2::ns3;
cout << ns123::x << endl;
ns123::foo ();
注意:
1)名字空间结束后无需分号。
2)名字空间可以在全局作用域内,也可以在其它名字空间中,但不能在函数或类的定义中。