C++命名空间详解
一、什么是命名空间?
举例:
命名空间就像一栋刚建好的教学楼,每个教室都差不多,而且还没有贴门牌号,只知道这个教学楼叫工科楼,然后学校安排学生去上课,结果学生们只能站在教学楼外玩手机,因为他们也不知道该去那间教室。学校为了解决这个问题,立马喊人为每间教室贴了门牌号,如101(表示一楼一号教室)、102、103… 这里的101等门牌号我们就可以理解为命名空间。
含义:
在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
二、 命名空间的定义
定义:
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
举例:
namespace N
{
}
三、命名空间的特点
1、命名空间中可以定义变量、函数、类型
例如:
namespace N1
{
//变量
int sum=1;
//函数
void Add(int a,int b)
{
return a+b;
}
//结构体
struct Node
{
struct Node* code;
int val;
}
}
2、命名空间可以嵌套
例如:
namespace N2
{
namespace N4
{
namespace N5
{
....... //一般嵌套两层
}
}
}
3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。
例如:
//test.h
namespace N
{
int Mul(int left, int right)
{
return left * right;
}
}
//test.c
namespace N
{
int Mul(int left, int right)
{
return left * right;
}
}
最终一个工程中的test.h和上面test.cpp中两个N会被合并成一个。
四、命名空间的使用
1、加命名空间名称及作用域限定符(:😃
举例:
namespace N
{
int a=1;
}
int main()
{
printf("%d\n",**N::a**);
return 0;
}
2、使用using将命名空间中某个成员引入
举例:
namespace N
{
int a=1;
}
using N::a;
int main()
{
printf("%d\n",a);
return 0;
}
3、 使用using namespace 命名空间名称 引入
举例:
namespace N
{
int a=1;
}
using namespace N;
int main()
{
printf("%d\n",a);
return 0;
}
五、命名空间使用的细节
1. 在日常练习中,建议直接using namespace std即可,这样就很方便。
2. using namespace std展开,标准库就全部暴露出来了,如果我们定义跟库重名的类型/对象/函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 + using std::cout展开常用的库对象/类型等方式。