1. 问题:命名空间污染 namespace pollution
多个库将名字放置在全局命名空间
1.1 一般人的解决方法
起长名字
eg.
class cplusplus_primer_Query {...}
string cplusplus_primer_make_plural (size_t, strings&);
2. 命名空间namespace
分割了全局命名空间, 其中每个命名空间是一个作用域。 通过在某个命名空间中定义库的名字, 库
的作者( 以及用户) 可以避免全局名字固有的限制
2.1 定义
关键字namespace + 命名空间的名字{
// 类
// 变量( 及其初始化操作)
// 函数( 及其定义)
// 模板和其他命名空间
}
eg.
//Sale_item.h
namespace cplusplus_primer{
class Sale_item{};
Sale_item operator+(const Sale_item&,const Sale_item&);
class Query { };
class Query_base { };
}
2.2 每个命名空间都是一个作用域
命名空间中的每个名字都必须表示该空间内的唯一实体。
因为不同命名空间的作用域不同, 所以在不同命名空间内可以有相同名字的成员定义在某个命名空间中的名字可以被该命名空间内的其他成员直接访问, 也可以被这些成员内嵌作用域中的任何单位访问。
cplusplus_primer::Query q = cplusplus_primer::Query ("hello" );
AddisonWesley:: Query q = AddisonWesley::Query ("hello" );
2.3 命名空间可以是不连续的
命名空间可以定义在几个不同的部分,可以将几个独立的接口和实现文件组成一个命名空间
命名空间的组织方式类似于管理自定义类及函数的方式:
-
命名空间的一部分成员的作用是定义类, 以及声明作为类接口的函数及对象, 则这
些成员应该置于头文件中, 这些头文件将被包含在使用了这些成员的文件中。 -
命名空间成员的定义部分则置于另外的源文件中
eg.
#include 应该出现在打开命名空间的操作之前, 否则程序将出错,因为会意味着我们将命名空间std嵌套在命名空间cplusplus_primer中
//--Sales__data.h //#include 应该出现在打开命名空间的操作之前 #includenamespace cplusplus_primer { class Sales_data { }; Sales_data operator+(const Sales_data&, const Sales_data &); //Sales_data 的其他接口函数的声明 } // ---- Query.h ---- namespace cplusplus_primer { class Query { public: Query(const std::string&); std::ostream &display(std::ostream&) const; //... }; class Query_base { }; } // ---- Sales_item.cc ---- #include "Sales_item.h" namespace cplusplus_primer { // definitions for Sales_item members and overloaded operators } // ---- Query.cc ---- #include "Query.h" namespace cplusplus_primer { // definitions for Query members and related functions } //--user.cc--- //Sales_data.h 头文件的名字位于命名空间 cplusplus_primer中 #include "Sales_data.h" int main ( ){ using cplusplus_primer::Sales_data; Sales_data transl, trans2; // ... return 0; }



