【C++】namspace和using指示符的简单使用

namespace

一、namspace机制提出的意义
1、C中的作用域
我们都知道C中的作用域有两个:
(1)全局作用域
(2)局部作用域
那么它们是如何实现的呢?
假设现在有一个项目,这个项目有很多人一起去实现,那这个项目下可能有很多的源文件。
比如A现在写的源文件为:

int Sort(int arr[],int len);//升序排序,快排

B同学所写的源文件为:

int Sort(int arr[],int len);//降序排序,堆排序

C同学所写的源文件为:

int Sort(int arr[],int len)//升序排序

现在如果将项目整合的话,就会在全局作用域中出现了三个同名的函数,这就是所谓的函数命名冲突。如果只选取一个源文件的话,就会导致其他文件的代码不可用。这块的最大原因就是C中的作用域太少了。
2、C++中的作用域
所以C++在处理这些问题的时候就提出了很多作用域
(1)全局作用域
(2)局部作用域
(3)namespace 名字空间作用域
(4)类作用域
二、namespace作用域
如果这块要是有名字空间作用域的话,C中命名冲突的问题就可以解决了。它是以这样的方式处理的。

namespace + 名称

例:

namespace WLY1234
{
	int a = 10;
	int Sum(int a,int b)
	{
		return a + b;
	}
}
int a = 20;
int main()
{
	int b = a;
	cout << b <<endl;
	return 0;
}

打印出来的结果是
在这里插入图片描述
首先这个程序能通过,说明我们定义的两个a不在一个作用域下。打印的结果是20,说明将全局变量的a的值赋值给了b。如果想要打印名字空间作用域下的a的值的话我们就需要这样做:

namespace WLY1234
{
	int a = 10;
	int Sum(int a,int b)
	{
		return a + b;
	}
}
int a = 20;
int main()
{
	int b = WLY1234::a;
	cout << b <<endl;
	return 0;
}

::这个符号的意思是作用域符号

这个时候打印的结果就是10
在这里插入图片描述
针对C中命名冲突的问题我们就可以这样修改
将A同学写的源文件命名改为

namespace A{
	int Sort(int arr[],int len);
}

B同学

namespace B{
	int Sort(int arr[],int len);
}

C同学

namespace C{
	int Sort(int arr[],int len);
}

这样调用A时就可以用A::Sort;调用B就可以用B::Sort;调用C时就可以用C::Sort。这样就不会有冲突
名字空间作用域的作用:解决命名冲突的问题。

using指示符

一、using namespace std的问题
1、using
先看这样一段代码

namespace WLY1234
{
	int a = 10;
	int Sum(int a,int b)
	{
		return a + b;
	}
}
int main()
{
	using WLY1234::a;
	int b = a;
	cout << b << endl;
	return 0;
}

这个程序打印的结果为10
在这里插入图片描述
但是如果将using WLY1234::a这句代码去掉,程序就会出错
在这里插入图片描述
为什么会出错呢?如果去掉这句代码,当前main函数的作用域中没有a,就会到全局找,发现全局也没有a,a在名字空间作用域中,所以程序会出错。这个时候就需要知道using的特点
2、using的特点
using声明就是将using后面加的符号暴露在using声明当前的作用域下。
所以刚才的代码就是将a暴露在main的局部作用域下,所以a就可以使用了。
二、using namepace
using指示符将后面加的名字空间作用域下的所有符号暴露在using指示符当前的作业域下

namespace WLY1234
{
	int a = 10;
	int Sum(int a,int b)
	{
		return a + b;
	}
}
int main()
{
	using namespace WLY1234;//将namespace WLY123
	下所有的东西包括a和sum函数的使用都暴露在了main函数的作用域下
	int b = a;
	cout << b << endl;
	return 0;
}

三、std
std:C++标准名字空间作业域
所有代码都会包含在std名字作业域下
C++中所有的头文件都被包含在std中,所以using namespace std的作用就是将std中所有的函数暴露在当前的全局作用域下,所以我们就能使用cout、cin、endl
四、using指示符的缺点
namesapce是为了解决命名冲突的问题,如果加上using就会又重新出现命名冲突的问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值