[知识点] 1.4.4 命名空间
总目录 > 1 语言基础 > 1.4 C++ 语言基础 > 1.4.4 命名空间
前言
可能是目前最简短的一篇?因为实在不知道可以和哪一篇一起讲了。
更新日志
20200903 - 增加作用域和全局/局部变量的介绍。
20211023 - 作用域、全局/局部变量等内容移至 1.2 C 语言进阶。
1.4.4 命名空间
C++ 另一大特性 —— 命名空间(namespace),用来解决复杂项目中名字可能出现冲突的问题——比如某项目由 jk 和 bebe 共同完成,而他俩在定义变量名时总是重复,比如都使用了 vis 作为标记数组,那么就可以使用 namespace 来对各自的工作空间进行切割:
1 #include <bits/stdc++.h> 2 3 namespace jk { 4 int vis[20]; 5 } 6 7 namespace bebe { 8 int vis[20]; 9 } 10 11 int main() { 12 jk :: vis[1] = 1; 13 bebe :: vis[1] = 0; 14 return 0; 15 }
当然并非每次都需要强调这是谁的 vis。使用 “using namespace ” + 空间名,相当于是划分地盘:
1 #include <bits/stdc++.h> 2 3 namespace jk { 4 int vis[20]; 5 } 6 7 namespace bebe { 8 int vis[20]; 9 } 10 11 int main() { 12 using namespace jk; 13 vis[1] = 1; 14 bebe :: vis[1] = 0; 15 return 0; 16 }
这里表示,主程序这一块都是 jk 的,jk 住在这里了,那么他自己的东西就不用再强调是谁的了,vis[1] 等价于 “jk :: vis[1]”,而外人 bebe 仍需标明。
所以,平时竞赛最常用的 using namespace std 是指什么?是 C++ 默认提供的一套标准命名空间,里面包含 cin, cout, endl, ... 等等。
当然,除了上述这样允许访问某命名空间的任何成员,也可以选择仅访问其中一个成员,比如 using std :: cin,等等。
在命名空间中可以使用作用域限定符 ::,关于作用域请参见 1.2 C 语言进阶 的 作用域与存储类别 部分;
这是 C++ 特有的符号,以解决局部变量与全局变量同名时全局变量会被屏蔽的问题;
如果我们对某个变量指定了作用域,编译器就会忽略更外层作用域的同名实体。