C++命名空间using namespace std是什么意思
作者:罅隙`
一、 前言
C++中的using namespace std
是什么意思呢?为了理解其中的含义,我们首先需要学习一个概念叫做命名空间。
我们都知道,C语言规定变量名不能与关键字冲突,但是并没有规定变量名不能与库中的变量名冲突,但这在实际的操作的过程中就会产生意想不到的错误:
例如,将一个time变量放在main函数中,根据局部优先的原则,time变量就会被理解为一个局部变量。但当time作为一个全局变量出现的时候,由于time库中也含有一个名叫time的函数名,头文件被展开后,此time被理解为变量名还是函数名就会产生歧义。
而C++中出现的命名空间概念就是为了填C语言中的这个坑。
✪总结:同一个域中不能出现两个重名的变量名/函数名,而命名空间的提出就是为了对标识符的名称进行本地化,以此解决命名污染的问题,其作用就是定义一个新的作用域
二、作用域分解运算符
在讲命名空间的时候首先给大家介绍一个作用域分解运算符 " :: " 。
✪使用说明
A,B表示两个类,而在A,B中都有成员member
- A :: member表示类A成员中的member
- B :: member表示类B成员中的member
当前面的类不指定的时候,默认为全局
前面说到变量名冲突的时候遵循局部优先原则,那么我们能不能就想访问到全局变量呢?我们就可以通过作用域分解运算符实现:
三、命名空间使用介绍
namespace my_variant { int time = 10; } int main() { printf("%d", my_variant::time); }
✪基本介绍①
- namespace是一个C++中的一个关键字
- 我们将变量定义在自己创建的my_variant命名空间,以避免被污染
- 访问命名空间中的变量,需要使用作用域分解运算符
- 命名空间只能定义在全局,其中定义的变量为全局变量
namespace my_variant { int time = 10; typedef struct Stu { char name[10]; int age; int score; }Stu; namespace _variant { int Add(int a, int b) { return a + b; } } } int main() { my_variant::Stu data = {0}; int ret = my_variant::_variant::Add(1, 2); }
✪基本介绍②
- 从上面我们可以看到命名空间中过的内容不只局限于变量名,也可以是函数名,类型名
- 命名空间可以无限次嵌套命名空间,同样的使用里面的内容的时候也需要多次使用作用域分解运算符——一层一层对应的关系。使用嵌套命名空间可以解决命名空间内部的命名冲突
- 一个工程中同名的命名空间最终会被合并为一个命名空间
当然我们可以看到,每次要使用命名空间中的变量都需要写很多额外的内容,有没有什么办法可以简化操作呢——我们想要访问命名空间中的space_b有两种方法:
namespace space_a { int a1 = 1; int a2 = 2; namespace space_b { int b1 = 10; int b2 = 20; int b3 = 30; } namespace space_c { int c1 = 5; int c2 = 6; } }
using namespace space_a; using namespace space_b;
方法①:首先将space_a中的内容全部释放出来,再释放其中的space_b的内容(注意顺序不能颠倒,否则space_b认不出来)
using namespace space_a:: space_b;
方法②:用什么放什么。只是将space_b中全部的内容释放出来,而不会对其他的内容产生影响。
释放出来之后我们便可以愉快自由的使用了:
四、using namespace std
经过上面的学习,我们不难理解using name std
的作用是释放std命名空间中的变量名,函数名以及类型名,其中std是C++标准库的命名空间。
我们在书写代码的时候为了方便于是将C++标准库中的命名空间完全展开了,但是最好的做法我想还是用什么放什么。
另外,标准C++库中提供两种头文件,前面以C开头的头文件是支持命名空间的,而后者是不支持的。
总结
到此这篇关于C++命名空间using namespace std是什么意思的文章就介绍到这了,更多相关C++命名空间using namespace std内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!