经过简单的学习了C++的知识也是初步认识了命名空间(namespace),下面是一个简单的没有内容的命名空间。
namespace liain
{
··
}
我们知道不同种类的变量是有自己的作用域的也就是生命周期,对于下面的变量a来说,主函数外面的全局变量的生命周期是对于整个源文件的,而主函数里的a来说则仅仅在主函数里,出了函数则无效。而且变量还遵循局部性原理应该都会吧(●'◡'●)
#include<iostream>
//using namespace std;
namespace liiain
{
}
int a = 10;
int main()
{
int a = 5;
return 0;
}
为什么要命名空间的的存在?命名空间的意义又是什么?
我们知道一个项目会有很多的头文件,不同的头文件不可避免的会有命名相同的情况,编译器是没有办法识别该用哪种方法,如下图我们可以看到两个头文件都想写一个初始化函数,我们在主函数调用Initial()时我们又该怎么调用呢,是用head1的呢还是head2的呢?这是命名空间便显示出它的作用了。
假如猪哥和杭哥一起做项目,都想给自己的函数命名同一个东西,怎么办?命名冲突了,是下班天台打一架还是各玩各的?(借用一下大佬的讲的故事,玩笑玩笑)想要命名相同的话我们就自己给他一个空间,我们调用的时候使用::(双冒号)前面带着自己命名空间的名字就行。如下:
#include<iostream>
#include"head2.h"
#include"head1.h"
//using namespace std;
namespace liiain
{
}
int a = 10;
int main()
{
int a = 5;
one::Init();
return 0;
}
那这样呢?,这个a会输出什么?这就涉及了编译默认查找顺序,首先编译器现在局部域寻找,然后再上全局域寻找,而命名空间中的数据的你不给编译器指令,编译器是不会动命名空间的数据的。
#include<iostream>
#include"head2.h"
#include"head1.h"
//using namespace std;
namespace liiain
{
int a = 30;
}
int a = 10;
int main()
{
int a = 5;
//one::Init();
printf("%d", a);
return 0;
}
当然,当你有一个东西你要用很多遍,你又不想像下面这样,你便可以使用using关键字咯。当然你可以把liiain这个命名空间全部放开,你也可以放开一部分。
#include<iostream>
#include"head2.h"
#include"head1.h"
//using namespace std;
namespace liiain
{
int a = 30;
int Add(int a, int b)
{
return a + b;
}
}
//int a = 10;
int main()
{
//int a = 5;
//one::Init();
//printf("a=%d", a);
liiain::Add(1, 3);
liiain::Add(1, 4);
liiain::Add(1, 5);
liiain::Add(1, 6);
liiain::Add(1, 7);
return 0;
}
当然你可以把liiain这个命名空间全部放开,你也可以放开一部分。
using namespace liiain
using liiain::Add;
Add(1,2);
注意我们放开命名空间是有隐患的,很有可能便会造成一些命名冲突,一般我们都会放开一部分。
所以编译默认查找顺序
先在当前局部域
再到全局域
再到展开的命名空间查找
默认情况下不会到命名空间去找-
命名空间不仅可以定义变量还可以定义函数,还可以定义其他的命名空间(命名空间的嵌套)
//讲个故事,帮助理解:在学校里,班主任喊你过来对你说“小明呀,隔壁班班主任老是说他班的学生纪律很好,让我班的学生学学,所以你去借鉴借鉴。”(这就正向是一个命名空间开放了一样,你想用就用);而隔壁班的隔壁班的班主任也对你班主任说了这个事,所以你去两个班哪个班都可以(就像两个命名空间都开放了相同的东西,你用谁的都可以),但是时候别人问你你在哪班学习的纪律呀效果这么好(用的是时候还是要标上用的谁的)。小明为什么不去楼下或者楼上去学习纪律呢?因为楼上楼下没有说过可以去他们班学习纪律,但是小明要求要去他们班学习纪律他们会不允许么?(就如命名空间没有开放,但是你去要求使用还是能使用的)
ok,再见(●'◡'●)