[知识点] 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++ 特有的符号,以解决局部变量与全局变量同名时全局变量会被屏蔽的问题;

  如果我们对某个变量指定了作用域,编译器就会忽略更外层作用域的同名实体。

posted @ 2020-05-19 15:43  jinkun113  阅读(264)  评论(0编辑  收藏  举报