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就会又重新出现命名冲突的问题