为什么使用命名空间?
假设我班有俩个同学,一男一女都叫Eric,但是如果他俩同时在我面前我只叫Eric的话,他俩会不知道我在叫他俩哪位?
同样的,我们将这种现象放在代码中。程序员对对象命名的时候,一般都会起一些有意义的名称。在一段代码中会现很多的实体,这些实体可能拥有不同的功能,但是他们有同样的名称。但是,c++中采用的是单一的全局变量命名空间,在这单一的空间中,实体必须有唯一的名称。现实中会经常出现同名的现象,这种命名冲突被称为“名字污染”。
- 为了从根本上解决这种现象,c++引入了命名空间的命名机制,将不同的实体放在不同的命名空间中,即便它们有相同的名称,但是被放在不同的命名空间中,它们就不会冲突。这种方式就好比,我现在叫我班的Eric,可以在前面加女Eric;男Eric来区别他俩。
- 对于命名空间的理解,可以将其理解为一个文件夹,文件夹内部的对象就是一个一个的文件,不同的文件夹中可以有相同名称的文件,在用文件夹内部的文件时,只要指定是哪一个文件夹中的文件就OK~~~但是我们理解可以这么理解,但是二者本质的区别是命名空间是一种逻辑意义的组合;而文件夹是一种物理意义的组合。
定义命名空间
命名空间用namespace
来声明,后面紧跟空间的名称,名称之后是由 {}
包含起来的声明块。在一个命名空间内声明的实体被称为命名空间成员(namespace member)。
命名空间的格式:
namespace space_name{
...
}
举例说明:
#include <iostream>
using namespace std;
namespace Boy{
class Eric{
public:
int fun(){
cout << "我叫Eric,我是男孩子~~~" << endl;
return 1;
};
};
char *str = "I am Eric, In namespace Boy";
}
namespace Girl{
class Eric{
public:
int fun(){
cout << "我叫Eric,我是女孩子~~~" << endl;
return 1;
};
};
char *str = "I am Eric, In namespace Girl";
}
int main(){
Boy::Eric boy;
Girl::Eric girl;
boy.fun();
girl.fun();
cout << Boy::str << endl;
cout << Girl::str << endl;
return 0;
}
输出效果:
分析代码: 该代码定义了俩个命名空间Boy和Girl, 在俩个命名空间中都有同样的类名Eric和变量str,但是在使用时明没有发生冲突。