1.库倾向于定义许多全局名字——主要是模板名、类型名或函数名。在使用来这些名字中有一些几乎不可避免地会发自多个供应商的库编写应用程序的时候,生冲突,这种名字冲突问题称为命名空间污染问题。
2.命名空间为防止名字冲突提供了更加可控的机制,个命名空间是一个作用域,通过在命名空间内部定义库中的名字,库的作者(以及用户)可以避免全局名字固有的限制。
3.命名空间定义以关键字 namespace 开始,后接命名空间的名字。命名空间可以在全局作用域或其他作用域内部定义,但不能在函数或类内部定义。
4.命名空间作用域不能以分号结束。
namespace cplusplus_primer {
class Sales_item { /* ... */};
Sales_item operator+(const Sales_item&,
const Sales_item&);
class Query {
public:
Query(const std::string&);
std::ostream &display(std::ostream&) const;
// ...
};
class Query_base { /* ... */};
}
5.命名空间外部的代码必须指出名字定义在哪个命名空间中:
cplusplus_primer::Query q =
cplusplus_primer::Query("hello");
q.display(cout);
6.像对 std 中定义的命名空间所做的那样,可以编写 using 声明(第 3.1 节)来获得对我们知道将经常使用的名字的直接访问:
using cplusplus_primer::Query;
7.一个命名空间的分离部分可以分散在多个文件中,在不同文本文件中的命名空间定义也是累积的。