C++引入名字空间(namespace)意义何在?为什么using namespace std会成为常用语句?

名字空间(namespace)的最大意义大于解决名字重复问题,下面是问题的来龙去脉。

在没有引入名字空间的概念之前,用户在一个cpp文件(即C++代码的源码文件)的开始位置一般会引入头文件,比如<stdio.h>,这里面就有已经定义好的全局变量、函数名、和类名,如果这些全局变量、函数名、和类名数目不多,那程序员在写自己的程序时引入的新名称还不容易重复。

但是如果很不幸引入了多个头文件,那么这些头文件里的全局变量、函数名、和类名非常多,程序员在写自己的代码段时就很容易造成名字重复了。若我们同时把C的标准库<stdio.h>、<ctype.h>、<stdlib.h>、<string.h>、<assert.h>、<limits.h>、<stddef.h>、<time.h>、<float.h>、<math.h>、<error.h>、<locale.h>、<setjmp.h>、<signal.h>、<stdarg.h>引入到头文件中,那名字重复的概率就很大了。这时编译器该匹配哪个呢?只好取决于哪个库文件先被引用到文件中,并且把另外一个完全屏蔽掉。这显然不是一个好的方法。在标准库的产生过程中,这个问题被提了出来。

为了解决上面这个问题,C++引入了名字空间(namesapce)的概念,对于C++的标准库而言,其对应的名字空间为std,标准库的组件都在名字空间std中定义,由用户手动引入到程序中。那么名字空间为啥能解决名字重复的问题呢?别急,看一下名字空间的用法示例知道了。 

以标准库的名字空间std为例,使用标准库中名字为“cout”和“endl”的对象的方法有下面三种:

如果您想知道下面三段程序中的“#include <iostream>”是什么意思,可以参见我写的另一篇博文,链接:https://blog.csdn.net/wenhao_ir/article/details/50895223

①使用时由标示符限定命名空间:

//此程序用于学习名字空间namespace的使用
//作者微信/QQ 2487872782
//有问题可以联系作者交流

#include <iostream>

int main( )
{
	std::cout<<"Hello!"<<std::endl;

	return 0;
}

②使用“usingstd::cout;”和“using std::endl;”事先分别声明,需要用哪个引用哪个。

//此程序用于学习名字空间namespace的使用
//作者微信/QQ 2487872782
//有问题可以联系作者交流

#include <iostream>

using std::cout;
using std::endl;

int main( )
{
	cout<<"Hello!"<<endl;

	return 0;
}

③使用using namespace std;事先声明,这样相当于引入了名字空间"std::"的所有内容。

//此程序用于学习名字空间namespace的使用
//作者微信/QQ 2487872782
//有问题可以联系作者交流

#include <iostream>

using namespace std;

int main( )
{
	cout<<"Hello!"<<endl;

	return 0;
}

我们看到第①种和第②种相当于给名字前加了前缀,这就是名字空间能够解决名字重复问题的原因。

个人不推荐第③种的写法,第③种写法把名字空间"std::"中所有定义的名字都包含进来了。当程序中只使用一个名字空间时当然不会出什么问题,如果程序中使用的名字空间多,那还是容易出现名字上重复问题。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值