1、命名空间的定义
大型应用程序经常使用来自不同厂商的开发库,几乎不可避免的会使用相同的名字,也就是说一个库中定义的名字可能与其他库中的名字相同而产生冲突,使得程序员不能组合各自独立的开发库到一个程序中。
命名空间是用来限定名字的解析和使用范围的,它是c++开发大型程序的工具之一。
命名空间的原理是将全局作用域划分为一个一个的命名空间,每个命名空间是一个独立的作用域,在不同命名空间内部定义的名字彼此之间互不影响,从而有效避免了命名空间的污染。
定义命名空间
命名空间的定义形式为:
namespace 命名空间名 {
...
}
命名空间可以在全局作用域或其他命名空间内部定义,但不能在函数、结构体或类部定义,且要保证命名空间之间不会出现名字冲突。
在命名空间的作用域内,可以包含以下内容:
1、变量、对象以及它们的初始化
2、枚举常量
3、函数声明以及函数定义
4、类、结构体声明与实现
5、模板
6、其他命名空间
举例:
1)每个命名空间是一个作用域
定义在命名空间中的实体称为命名空间成员。命名空间中的每个名字必须是该命名空间中的唯一实体,不同命名空间可以具有同名成员(变量名和函数名也不能相同)。
在命名空间中定义的名字可以被命名空间中的其他成员直接访问,命名空间外部的代码必须指出名字定义在哪一个命名空间中,即作用域运算符限定命名空间,形式为:
命名空间::成员名
例如:
namespace A { //定义命名空间A
int i = 10;
void output1() {cout << i;} //同一命名空间中直接引用成员i
}
void output2() {cout << A::i; } //引用命名空间限定成员A::i
2)命名空间可以是不连续的
命名空间可以在几个部分中分开定义,即命名空间是累计的。一个命名空间可以分散在多个文件中。
namespace A{
int i;
}
namespace B{
int i,j;
}
namespace A{
int j;
}
3)全局命名空间
定义在全局命名空间作用域的名字(任何类、函数或命名空间外部声明的名字)是定义在全局命名空间中的。全局命名空间存在于每个程序中,是隐式的。
可以用作用域运算符引用全局命名空间的成员:
int i = 10; //全局作用域
namespace A{ //命名空间A
void output()
{cout << ::i;} //使用全局作用域成员
}
4)嵌套命名空间
嵌套命名空间中的名字遵循名字规则:外围命名空间中声明的名字被嵌套命名空间中同一名字的声明所屏蔽
2、未命名的命名空间
定义命名空间时如果没有给出命名空间的名字,称为未命名的命名空间,定义形式为:
namespace {
...
}
1)未命名的命名空间中定义的名字可以直接使用,没有命名空间名字来限定它们。
2)未命名的命名空间可以在给定文件中不连续,但不能跨越文件,每个文件有自己的未命名的命名空间。本质上在一个文件中所有未命名的命名空间会被系统用一个同一标识符代替,且区别于其他文件的标识符。
3)未命名的命名空间专门用于声明局部于文件的实体,类似于static的作用
3、命名空间的使用
引用命名空间成员的形式为:
命名空间名::成员名
例如:
1)命名空间的别名
可以为命名空间起一个别名来代替较长的命名空间名,形式为:
namespace 命名空间别名 = 命名空间名
例如:
2)using声明
可以使用using声明引入命名空间成员,形式为:
using 命名空间名::命名空间成员名;
一个using声明一次只引入一个命名空间成员,它是无论程序中使用那些名字,都非常明确。
using std::cout;
3)using指示
using指示的形式为:
using namespace 命名空间名;
using指示使得特定命名空间的所有名字可见,没有限制。
namespace A{
int i,j;
}
void f()
{
using namespace A;
cout << i*j <<endl;
}
4)标准命名空间的使用
标准命名空间的使用标准库的所有名字都是在一个名为std的标准命名空间中定义的,当程序中用到标准库,需要使用std作用域限定。