1.命名空间的意义
目录
2.3 在很多文件中允许同名命名空间,编译器会把它们合并到一起
在C/C++中,变量,函数,类会有很多定义在全局,可能会导致命名冲突的问题出现,使用命名空间的意义就是将它们隔绝开,避免命名冲突的问题,例如:
在C语言中以下代码没有问题
但如果包含头文件<stdlib.h>,就会出现报错
这是因为rand函数是在stdlib.h这个头文件中,包含了这个头文件编译器不知道要用库函数还是我们自己定义的全局变量,这时就会有命名冲突的问题,所以在C++中引入了命名空间这个概念,就专门来处理这种问题
2.命名空间的定义
命名空间使用namaspace关键字,后面跟上命名空间的名称,紧接着一对{}即可,在花括号中可以定义变量,类型,函数等

优先局部域
找不到就去全局域找
2.1 域作用限定符
如果局部域和全局域都没有,虽然命名空间中定义了,但也是未声明的标识符,这是因为编译器默认不会到命名空间中去查找,如果想到命名空间中去查找,就要用一个操作符::,这个操作符叫域作用限定符,就是用来指定域的
像这样,我们告诉编译器要在hx这个域中去查找a,编译器就可以找到了,并输出正确的结果
如果在::左侧没有类的名称,则是全局域
- 命名空间必须定义在全局,不能定义在某个域中
错误的使用方法
2.2 命名空间可以嵌套
访问hx1中的a,就需要指定类域,在hx里的hx1中的a,连续的嵌套
2.3 在很多文件中允许同名命名空间,编译器会把它们合并到一起
2.4 在C++标准库是放在std这个命名空间中的
3. 命名空间的使用
3.1展开全部命名空间
之前我们说编译器查找的规则是局部域->全局域,并不会主动到命名空间中去查找,当我们使用using这个关键字时,可以展开命名空间,展开的意思就是暴露在全局,现在局部没有,但是在全局中却发现了两个a,就会出现重定义的报错,而C++的标准库被封装在std这个命名空间中,所以我们使用using namespace std就相当于把标准库展开,把所有的东西暴露在全局,就使得命名空间的出现没有意义了,所以在大型工程中不建议使用,平时练习,oj题可以展开
3.2展开部分命名空间
这是展开部分,仅仅是展开hx这个命名空间域中的a,所以在主函数内可以访问得到,但是b,c依然被封装在命名空间中,访问不到
3.3指定访问命名空间
这是我们之前提到过的用域作用限定符指定访问命名空间中的变量,指定是在hx这个命名空间中去查找
总结
C++中引入命名空间是为了解决C语言命名冲突的问题,定义一个域来进行封装,命名空间就像一堵墙,起到隔离的效果,因为编译器默认不会去命名空间中去查找,所以如果想访问命名空间内的变量就要用域作用限定符。