【C++】命名空间

什么是命名空间

我们在使用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,所以我们无法访问它。这种方法通常用于我们经常使用命名空间的变量,它既能保持命名空间的隔离特性,也能方便我们写代码。

以上就是本篇的全部内容。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c铁柱同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值