命名空间的来历
用户编写代码的时候,定义了一个变量a,另外C++库里又提供了一个变量a,这时候C++程序就有两个a,编译并运行该程序的时候,编译器就不知道变量a到底是用户定义的变量a还是C++库提供的变量a。以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
命名空间的定义
在全局范围之内取一块区域并命一个名称,仅此而已
命名空间的分类
(1)有名(有名字)的命名空间
//格式
namespace 标识符的名字
{
//代码块或语句块
}
//举例
namespace zhang
{
int a;
}
(2)无名(没有名字)的命名空间
//声明格式:
namespace //表示声明的无名的命名空间
{
//代码块或者语句块
}
//举例
namespace
{
int a;
}
命名空间的访问格式
符号:域作用符号-----由两个冒号组成------::
(1)有名空间的空间访问
访问格式1
//格式
命名空间的名称 ::需要访问的内容
//举例
namespace zhang
{
int a;
}
zhang ::a;
访问格式2
关键字:using
//格式
using 命名空间名称::需要访问的内容
//举例
namespace zhang
{
int a;
}
using zhang::a;//如果后面用到a,那就表明是命名空间里的a
访问格式3
关键字:using、namespace
//格式
using namespace 命名空间的名称;
//举例
namespace zhang
{
int a=50;
int b=60;
}
using namespace zhang;
(2)无名的命名空间的访问
符号:域作用符号------::
//格式
::需要访问的内容
//举例
namespace
{
int a;
}
::a;
命名空间的作用域
它是属于全局的一部分,它实质也是全局的内容,如果变量声明或者是定义在命名空间作用域里,那么它的生命周期也是命名空间里的区域(即在该命名空间里可见,一旦超出命名空间就失效)
//举例
namespace zhang
{
int a;
}
注意
(1)一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中
(2)命名空间是可以发生嵌套
//格式
namespace 标识符的名称
{
namespace 标识符的名称
{
}
}
//举例
namespace zhangsan
{
int printf = 1;
int rand = 2;
int Add(int a, int b)
{
return a + b;
}
namespace lisi
{
int a = 0;
int Sub(int a, int b)
{
return a - b;
}
}
}
(3)同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
//格式
namespace 标识符的名称
{
//代码块或者是语句块1
}
namespace 标识符的名称
{
//代码块或者是语句块2
}
namespace 标识符的名称
{
//代码块或者是语句块1
//代码块或者是语句块2
}
//举例
namespace zhangsan
{
int a=2
}
namespace zhangsan
{
int b=3
}
namespace zhangsan
{
int a=2
int b=3
}