需要名称的单元: 变量、函数、结构、枚举、类、类和结构的成员。
随着项目大了,名称难免重复,这在c++里就叫冲突;另外使用多个厂商的类库时,同一个名称下的东西可能不一样,因此造成冲突;
为了解决名称冲突的问题,C++提供了名称空间工具,其实就是给每个名字加一个作用域,比如说有海里有两只派大星,一只来自大西洋,一只来自太平洋,那么给他们加上所属海就不会搞不清他们谁是谁了;
传统C++名空间
声明区域+潜在作用域+作用域 前者包含后者
作用域: 变量对程序而言可见的区域
潜在作用域:从声明点开始,到声明失效的未知这一连续区域
声明区域: 变量可以进行声明的地方
新的C++名空间
名称空间:声明名称的区域 一个名称区域不会和另一个名称区域中的名称发生冲突
- 可以将新的名称单元加入到已有的名称空间中
- 用户自定义空间 未命名的名称空间(提供了链接性为内部的外部静态变量的替代品)
- 名称空间可以嵌套在另一个名称空间中
- namespace{ } 创建
- :: 作用域解析运算符
- using 使用using让特定空间的名称可用 虽然using编译指令将名称空间的名称视为在函数外生命的,但他 不能直接使得该文件中的其他函数也能使用这些名称
- 一般来说,使用using声明比使用using编译指令更安全,这是由于它只导入特定的名称
- 如果与局部名称发生冲突,局部名称会覆盖名称空间版本
- 在名称空间中声明的函数名的作用域为整个名称空间,因此函数定义和声明必须位于同一个名称空间中;
名称空间及其前途:
- 使用声明的已命名的名称空间中的变量,而不是使用外部全局变量/静态全局变量
- 如果开发了一个函数库或类库,将其放在一个名称空间中。提倡将标准函数库放在名称空间std中,例如C++头文件cmath把各种数学库函数放在名称空间std中
- 仅将using的编译指令作为一种将旧代码转换为使用名称空间的权宜之计
- 不要再头文件中使用using编译指令,这样做掩盖了要让哪些名称有用;另外,包含头文件的顺序可能影响程序的行为,如果要用using应将其放在#include<>之后
- 导入名称,优先使用作用域解析符或者using声明
- using声明,首选将其作用域设为局部
头文件名称的变化反映了有没有使用名空间,如 iostream.h没有使用,而iostream使用了std名空间