命名空间和using namespace std的详解
命名空间
一.命名空间定义:
1.在C语言中只有一个全局作用域:
所有的全局标识符共享一个作用域
这使得标识符之间可能发生冲突。
2.C++中提出了命名空间的概念:
命名空间将全局作用域分成不同的部分
不同命名空间中的标识符可以同名而不会发生冲突
命名空间可以发生嵌套
全局作用域也叫默认命名空间
二.为什么用命名空间
在这里插入代码片 #include <stdio.h> #include <string.h> int strlen = 10; int main() { printf("%d", strlen); return 0; }
执行会报错:“strlen”: 重定义;以前的定义是“函数”
意思就是说,我们定义的变量名strlen与string.h库的strlen函数名冲突了,因为同一个作用域里面不能有相同的名称,但是C语言没办法解决这种问题,所以C++中引入了命名空间这个概念。
其实还有一个原因就是当一个项目需要多个人写的时候,就难免会出现名称冲突的情况,这时候如果是C语言我们对于这种问题只能要求程序员之间去修改名称,但是如果是C++的话,我们可以用命名空间,来允许多个名称相同的情况。 对此ANSI C++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。命名空间是用来限定名字的解析和使用范围,它是C++开发大型程序的工具之一。命名空间的原理是将全局作用域划分为一个一个的命名空间,每个命名空间是一个独立的作用域,在不同命名空间内部定义的名字彼此之间互不影响,从而有效的避免了命名污染。
2.命名空间的定义(namespace)
定义命名空间,需要用到namespace关键字,然后加上一个命名空间的名字,最后花括号{}括起来即可 2.1 通常定义 • 1 • 2
在这里插入代码片 namespace A //A的命名空间 { int a = 20; int b = 30; ...//也可以定义函数 } namespace B //B的命名空间 { int a = 40; int b = 60; }
2.2 嵌套定义
在这里插入代码片 namespace N1 { int a; int b; int Add(int left, int right) { return left + right; } namespace N2//嵌套在N1中 { int c; int d; int Sub(int left, int right) { return left - right; } } }
3.域作用限定符(::)和命名空间的使用
域作用限定符 ::使用方式就是 作用域 ::变量名,如果作用域为空格则为在全局域中寻找变量。 • 1
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> int j = 0; namespace July { int J = 10; int U = 11; namespace July1 { int L = 20; int Y = 21; } } using namespace July;//释放July的命名空间, int main() { printf("%d\n", July1::L);//L是嵌套在July1中的变量, printf("%d\n", J);//因为释放了July,打开了该命名空间中的所有变量,函数,方法;所以使用的是命名空间中的变量J,就不用在家作用域 //printf("%d\n", July::J);就不用这么写了 //如果没有Using name July ,那么,此时使用J变量是会报错, return 0; }
命名空间的使用方式
1.加命名空间名词和域作用限定符
命名空间::变量
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> namespace July { int J = 10; int U = 11; } int main() { printf("%d\n", July::J);//看这里 return 0; }
2.使用using将命名空间中某个成员引入
这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。
using 命名空间 ::变量
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> namespace July { int J = 10; int U = 11; namespace July1 { int L = 20; int Y = 21; } } using July::J;//这种方式也叫局部展开,就是把命名空间中的一些变量在全局域中展开了。 int main() { printf("%d\n",J); return 0; }```
3.使用using namespace 命名空间名称 引入
这种方式也叫全局展开,就是把命名空间中的所有变量在全局域中展开。
#define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> namespace July { int J = 10; int U = 11; namespace July1 { int L = 20; int Y = 21; } } using namespace July;//释放July的命名空间,即可以直接使用里面的所有变量,函数等等 int main() { printf("%d\n",J); printf("%d\n",U); printf("%d\n", July1:: L); printf("%d\n", July1:: Y); //可以使用全部 return 0; }
以小见大: using namespace std 也就是这样的道理,只是说std里面包含了C++标准程序库中的所有 变量,函数,对象。然哥个人理解,
using namespace std
一. using namespace std是什么
1.打开标准命名空间,即告诉编辑器我们将要使用名字空间std中的函数或者对象。
2.using 意思就是正在使用的意思。
3.namespace 在 C++ 中被提出来,用来解决 C语言 不能重定义的问题
namespace 被称为 命名空间 ,作用就是 将变量 或 函数等 规划到了不同的作用域 ,这样就起到了 将变量隔离的效果,就不用再担心会有重定义的现象发生了。
4.std:是个名称空间标识符,C++标准库中的函数或者对象都是在命名空间std中定义的,所以我们要使用标准库中的函数或者对象都要用std来限定。
二.using namespace std为什么少用
1.标准库是不断更新的,更新后std新增的标准库命名可能会和更新前我们代码中自定义的命名冲突,所以不建议代码中直接把std全部导入,用到什么导什么,最安全。
2.使用后你的整个代码将无法使用与std标准库中的名字。不使用using namespace std就是为了 有效的防止命名冲突
3.标准库里的变量&函数非常多且命名方式不唯一,当你项目的代码量足够大时很难保证不与标准库内的命名恰好一样,我们在做项目时一般都会用自己定义的变量/函数实现一些功能,允许这些自己的东西在全局使用才是我想要的,而不是我每次使用自己的东西还要通过命名空间去取,这样反倒更影响我写代码的效率了。
以上内容仅个人学习随记,如有不对,敬请指导!