1、命名空间引入
假设有一种情况,在一栋教学楼中,A班级和B班级都有一个女生叫小红,C班级的小明对A班的小红爱慕已久,于是在某一天小明捧着玫瑰花,在教学楼楼下大声的喊“小红我爱你”,请问你知道小明是喊哪个小红吗?所以说这种就要引入命名空间的概念。
2、命名空间概述
命名空间是C++引入的可以由用户命名的作用域,用来处理程序中常见的命名冲突。
3、命名空间定义
(1)、一个名字空间可以在两个地方被定义:在全局范围层次或者是在另一个名字空间中被定义(这样就形成一个嵌套名字空间),不能在函数和类的内部定义。
(2)、名字空间可以是不连续的,他是由所有分离定义的部分的总体构成的。一个名字空间可以分散多个文件中,不同的文件中名字空间的定义也是累积的。通常将名字空间的声明放到头文件中,实现放到源文件中。可以将不相关的成员放到不同的头文件中。
(3)、命令空间的作用域不能以分号结尾。
命名空间的定义使用关键字 namespace,后跟命名空间的名称,如下所示:
namespace namespace_name
{
// 代码声明
}
4、命名空间的成员
定义在命名空间中的实体称为命名空间的成员。
命名空间内的名字可以被该命名空间内的其他成员直接访问,命名空间外的代码必须指定该名字位于哪个名字空间。
一个命名空间可以包含多种类型的标识符,如:变量、常量、函数、结构体/联合体/枚举、类、嵌套名字空间。
5、命名空间访问
::通过域操作符访问命名空间的变量名或函数名
namespace namespace_name
{
int code;
}
namespace_name::code; //访问
6、命名空间的别名
可以给命名空间起一个别名,别名是已定义的命名空间的可替换的名称。
一个命名空间可以有许多别名,所有别名以及原来的命名空间名字都可以互换使用。
通过下面的形式将别名指定给已定义的命名空间的名字,就可以创建一个命名空间的别名。
//namespace 别名 = 已定义的名字空间名字;
namespace namespace_name
{
int code;
}
namespace name = namespace_name;
7、using 声明和 using 指示
(1)、using声明
一个 using 声明一次只引入一个命名空间成员。
using 声明的作用域从 using 声明点开始,直到包含 using 声明的作用域的末尾,名字都是可见的。外部作用域中定义的同名实体被屏蔽。
using 声明可以出现在全局、局部、类的作用域 和 命名空间中。在类作用域中using声明只能引用基类成员。
#include <iostream>
using std::cout; //using声明
using std::endl; //using声明
int main(void)
{
cout<<"Hello World"<<endl;
return 0;
}
(2)、using指示
using 指示使得整个命名空间中的成员都可见。
using 指示可以出现在全局、局部的作用域 和 命名空间中,不会出现在类的作用域中。
#include <iostream>
using namespace std; //using指示
int main(void)
{
cout<<"Hello World"<<endl;
return 0;
}
(3)、避免使用using指示
using 指示注入来自一个命名空间的所有名字,这个方法看似简单,但是如果应用程序使用许多库,并且用 using 指示使得这些库中的名字可见,那么,全局命名空间污染问题就重新出现。
相对于依赖于 using 指示,对程序中使用的每个命名空间名字使用using 声明更好,这样做减少注入到命名空间中的名字数目,由 using 声明引起的二义性错误容易发现和修正。