1、名字空间(namespace)的概念用来直接表示本属一体的一组特性,例如库代码。名字空间的成员都位于相同的作用域中,无需特殊符号即可相互访问,而从名字空间外访问它们就需要显式符号。
2、显式限定:我们可以在名字空间的定义中声明一个成员,稍后用“名字空间名::成员名”的语法定义它。
namespace Parser{
double expr(bool); //声明
double term(bool);
double prim(bool);
}
double val = Parser::expr(); //使用
double Parser::expr(bool b) //定义
{
//...
}
3、全局作用域也是一个名字空间,可以显式地用::来引用。
int f(); //全局函数
int g()
{
int f; //局部变量
f(); //错误:不能调用一个整形变量
::f(); //正确:调用全局函数
}
4、using声明将避免频繁使用显示限定写法。using指示允许我们在所在作用域中无须使用限定即可访问某个名字空间中所有名字。
5、名字空间是开放的。即,你可以从多个分离的名字空间声明中向一个名字空间添加名字。
namespace A{
int f(); //A包含成员f()
}
namespace A{
ing g(); //A现在有两个成员,f()和g()
}
6、名字空间是表达逻辑分组的一种机制。即,如果按照某些标准判定一些声明逻辑上属于一个整体,则可将它们放置在一个共同的名字空间中。
7、using声明将名字添加到局部作用域中,而using指示不会,它指示简单地令名字在其坐在作用域中可以访问。
8、通过为名字空间的长名起一个别名,我们就可以解决因名字空间名字较短会冲突,而太长又不实用的矛盾。同时,名字空间别名还允许用户引用“库”以及通过单一定义使用的具体是哪个库。
namespace American_Telephone_and_Telegram{
//...
}
namespace ATT = American_Telephone_and_Telegram;
ATT::String s3 = "Grieg";
ATT::String s4 = "Nielsen";
9、组合机制(using指示)和选择机制(using声明)的结合满足了现实世界中大多数应用实例对灵活性的需求。
namespace His_lib{
class String{/*...*/};
template<class T>
class Vector{/*...*/};
//...
}
namespace Her_lib{
template<class T>
class Vector{/*...*/};
class String{/*...*/};
//...
}
namespace My_lib{
using namespace His_lib; //using指示,表示His_lib中的所有实体
using namespace Her_lib; //using指示,表示Her_lib中的所有实体
using His_lib::String; //using声明,表示使用His_lib中的版本
using Her_lib::Vector; //using声明,表示使用Her_lib中的版本
template<class T>
class List{/*...*/}; //其他内容
}
10、名字空间的一种明显用法是将一组完整的声明和定义封装在独立的名字空间中。这些声明中通常会包含名字空间。名字空间是允许嵌套的。