在说命名空间之间,我们先思考一个问题:学习过Java,我见过不只一个都在说#include <filename.h> or #include "filename.h"其实就是和Java里面的import是一个性质的。真的是这样的吗?
就从Java谈起,为什么需要import这个语句,是因为分包,那么为什么需要分包,防止类的重命名造成语义的二义性,为什么仅仅是分包就能有效避免类名重复造成的二义性呢,因为Java一个class文件名必须和内部声明的一个pulic类名保持一致。这个推理很正常吧。import只是提供了一种外部类,并作以区分。因为Java是纯面向对象语言,所有的操作都是基于类调用,所以import将各个包下的代码汇总到了一起。
那么C++当中的头文件的作用呢,其实就一个引入类,变量,函数的声明,供另外一处使用,并且通过不重复引入头文件从而实现声明的不重复罢了。显然C++的头文件,只是起到了声明的作用,不包含引入,也不包含二义性的划分,同样也不是将各个文件统一起来的作用,只是引入声明。
那么我们说到这次的主题,命名空间。
我们来看命名空间的作用,用来区分重复函数名和变量名的二义性,这个其实就已经是类似于Java里面分包的概念了。我们通过using namespace std;这样来区分不同包下面的函数或者变量等。这么来理解功能看,其实命名空间才using namespace更接近于java里面的import概念。
最后说明一下,由于C++基于C语言的沿革而来的,先声明才能使用的逻辑并没有发生变化,和Java这种纯OO的基于类调用还是有区别的。语法糖只是糖,又不能当饭吃。理解这些也没什么用,没事写写总结一下。