命名空间(namespace)是为了避免可能遇到的名字冲突而设计的。一个命名空间是一个作用域,通过命名空间内部定义库中的名字,库的作者(以及用户)可以避免全局名字固有的限制。命名空间的语法形如:
- namespace space_name {
- ... //可以出现在全局作用域的任意声明,包括可以是其他命名空间
- }
2. 从命名空间外部使用命名空间成员。如下A和B两种方式,其它简化访问的方法稍后讨论。
- namespace cpp_primer {
- class Query{
- ...
- };
- }
- cpp_primer::Query q = cpp_primer::Query("hello"); //A
- using cpp_primer::Query;
- Query q = Query("hello"); //B
4. 接口和实现分离。可以使用头文件和实现文件来组织命名空间。
5. 定义命名空间成员。在命名空间内部定义和外部定义两种方式形如:
- //内部定义方式
- namespace cpp_primer {
- class SalesItem {
- // ...
- };
- std::istream&
- operator>>(std::istream& in, SalesItem& s) {
- // ...
- }
- }
- //外部定义方式
- cpp_primer::SalesItem
- cpp_primer::operator+(const SalesItem& lhs, const SalesItem& rhs) {
- SalesItem ret(lhs);
- // ...
- }
6. 不能在不相关的命名空间中定义成员。例如函数 cpp_primer::operator+()可以在cpp_primer命名空间中定义,也可以使用限定形式在全局作用域中定义。但是不能定义到另一个无关的命名空间内部。
7.关于全局命名空间。如果没有限定,定义在全局作用域的名字就是定义在全局空间中的。全局命名空间没有名字,所以使用::member_name来引用全局命名空间的成员。
8.嵌套命名空间。是一种层次结构,例如:
- namespace A {
- namespace B {
- class Something {
- // ...
- };
- }
- }
9.未命名的命名空间。命名空间可以是未命名的,未命名的命名空间在定义时没有给定名字。
- namespace {
- int i;
- }
10.命名空间的别名。可以用命名空间别名将较短的同义词与命名空间名字相关联。例如:
- namespace an_example_namespace {
- // ...
- }
- namespace aens = an_example_namespace;
- using namespace std;