C++的初识

经过简单的学习了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,再见(●'◡'●)

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值