什么是命名空间
我们在使用C语言写程序时,有可能会遇到重命名的情况,即定义的两个变量名字相同,这种情况在C语言中是不被允许的,只能通过修改其中一个变量的名称来避免这个问题,即使我们自己可以不使用重名的变量,但有可能我们定义的变量名与我们使用的库里的函数名会有冲突,如果我们不知道那也会造成命名冲突,或者比如有很多人同时在写一个项目时,每个人都会定义自己的变量,那就极有可能出现两个人定义的变量名相同的问题,C语言就无法解决这样的问题了,所以为了解决这些问题,C++提出了一个新的语法:命名空间。
当我们定义了一个命名空间,就相当于定义了一个域,在这个域里我们可以定义变量,定义函数。在不同的域中,变量就可以同名了,我们就可以定义一个自己的一个命名空间,在这个命名空间里面的变量就不用担心与别的变量重名,这样就解决了当多人协作时可能的重命名问题。
命名空间的定义
定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。
namespace N
{
int a=0;
int add(int x,int y)
{
return x+y;
}
}
在上面我们就定义了一个名叫N的命名空间,在这个空间里定义了一个变量a,和一个函数add。
命名空间还可以套娃
namespace N1
{
int a=0;
int add(int x,int y)
{
return x+y;
}
namespace N2
{
int sub(int x,int y)
{
return x-y;
}
}
}
在命名空间N1里面又定义了一个命名空间N2。
定义命名空间要注意的问题:
1.命名空间必须定义在全局。
2.如果在同一个工程中定义了多个名称相同的命名空间,那编译器会自动把这些命名空间合并成一个。
命名空间的使用
在命名空间以外使用命名空间内的变量,有三种使用方法。
(1)使用作用域限定符指定作用域,用法如下
int ret=1;
namespace N
{
int ret=0;
}
int main()
{
cout << ret << endl;
cout << N::ret << endl;
}
使用方法是命名空间的名称+作用域限定符+变量名称。
所以上面代码的打印结果为1,0。因为第一个ret没有指定作用域,所以使用的就是全局的ret,第二个指定了N,所以使用的就是N里面的ret。
(2)把整个命名空间展开
需要用到using关键字,其使用方法如下
//int ret=1;
namespace N
{
int ret = 0;
}
using namespace N;
int main()
{
cout << ret << endl;
cout << N::ret << endl;
return 0;
}
当我们展开了N这个命名空间,那我们再访问它里面的ret时可以限定,也可以不限定。相当于把这个命名空间一次性展开到全局。
我们在写C++程序时,通常都会在开头写上这么一句代码
using namespace std;
这句代码的意思就是展开一个叫做std的命名空间,其原因就是C++的库的实现是定义在一个叫std的命名空间里的,当我们展开了这个命名空间,我们就可以不用指定就可以使用这里面的名称,其中就有我们常用的标准输入和标准输出(cout&&cin)。
这种直接把命名空间展开的方式太过于简单粗暴,它直接使命名空间失效了,命名空间也就没有隔离的效果了,所以一般情况下不建议使用这种方法。但是如果我们要平凡的使用某些命名空间内的东西时,那我们难道每次都要在前面限定一下吗?我们还可以用第三种方法。
(3)用using单独展开某个,其他不展开
其使用方法如下
namespace N
{
int ret1 = 0;
int ret2 = 1;
}
using N::ret1;
int main()
{
cout << ret1 << endl;
cout << ret2 << endl;
return 0;
}
上面的代码我们就单独展开了ret1,如果我们直接运行这个代码,会报错说ret2是未声明的标识符。原因就是我们只展开了ret1,没有展开ret2,所以我们无法访问它。这种方法通常用于我们经常使用命名空间的变量,它既能保持命名空间的隔离特性,也能方便我们写代码。
以上就是本篇的全部内容。