🌈个人主页:羽晨同学
💫个人格言:“成为自己未来的主人~”
命名空间
在C/C++中,变量,函数和后面要学到的类都是大量存在的,这些变量,函数和类的名称都存在于全局作用域中,可能会导致很多冲突,使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。
首先,我们先来看C语言当中的一端代码
#include<stdio.h>
#include<stdlib.h>
int rand = 10;
int main()
{
printf("%d", rand);
return 0;
}
在这段代码当中,我们引用了stdlib.h这个库文件,所以,rand是一个函数,存在于全局作用域当中,同时,我们又定义了一个rand的变量,也存在于全局作用域当中,所以,这二者会产生冲突,从而导致发生错误。
这个便是C++当中namespace的优点所在,namespace这一个关键字,后面接命名空间的名字,然后后面加一对{}即可,{}当中的代码均属于这个命名空间。
我们来看看使用namespace之后的效果是什么
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
namespace bit
{
int rand = 10;
}
int main()
{
printf("%d", rand);
return 0;
}
大家可以猜一下打印的结果是什么
我们可以看到,打印出来的就是一个随机数,而不是我们赋值给的10,而且此时程序也不会进行报错,这个就是namespace的作用,namespace单独开辟了一个空间,而里面的rand便被隔离,
那问题来了,我们怎么样可以用到namespace中的内存数据呢
#include<stdio.h>
#include<stdlib.h>
namespace bit
{
int rand = 10;
}
int main()
{
printf("%d", bit::rand);
return 0;
}
这样子,我们就打印到了namespace当中的数据
::这个,叫做作用域限定符
除了这种方式之外,我们还可以采用其他的方式来完成我们的目的,
使用using将namespace中的某个变量展开,比如:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
//namespace bit
//{
// int rand = 10;
//
//}
//using bit::rand;
//int main()
//{
// printf("%d", rand);
//
// return 0;
//}
namespace bit
{
//命名空间中可以定义变量/函数/类型
int a = 0;
int b = 1;
int Add(int left, int right)
{
return left + right;
}
struct Node
{
struct Node* next;
int val;
};
}
using bit::b;
int main()
{
printf("%d", b);
return 0;
}
在这段代码当中,我们通过展开命名空间的某个变量的方式将b打印了出来,但是我们只是展开了b,这个时候是不能打印a的
会出现报错的情况。
将整个命名空间进行引入
我们以上面的那个代码作为例子
using namespace bit;
int main()
{
printf("%d", b);
printf("%d", a);
return 0;
}
这样子,我们既可以打印a,也可以打印b
接下来我们说几个其中的问题
首先,命名空间中的优先级是较高的(在指定的情况下)
局部变量的优先级最高(在非指定的情况下)
另外,需要注意的是,当命名空间展开后,变量的作用域和全局变量的作用域是相互冲突的
好了,这个就是我们关于C++的命名空间的全部内容了,我们下一篇再见