【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?

在这里插入图片描述

个人主页:@Weraphael
✍作者简介:目前学习C++和算法
✈️专栏:C++航路
希望大家多多支持,咱一起进步!
如果文章对你有帮助的话
欢迎 评论 点赞 收藏 加关注✨


标题

  • 一、问题引入
  • 二、什么是域(部分)
    • 2.1 全局域和局部域
    • 2.2 命名空间域
    • 2.3 如何同时访问三个域的变量
    • 2.4 三种域访问的优先问题
    • 2.5 访问命名空间域的方法
  • 三、使用using namespace的危害
  • 四、命名空间的嵌套
  • 五、总结

一、问题引入

  • 看看以下一串简单的C语言代码

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第1张图片

首先它是能在VS上编译通过的,并且在屏幕上打印了rand:600。但接下来我加上#include ,代码是否还能正常编译通过呢?

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第2张图片

rand重定义?这是为什么?
原因是:randstdlib库中的一个函数(如下图所示),当编辑器编译代码时,#include 就会被展开,相当于全局有一个rand函数,因此导致变量名和函数名相同,引发了命名冲突问题

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第3张图片

【总结】
C语言存在命名冲突问题:

  1. 可能与函数库中冲突
  2. 可能与同组开发冲突

因此,为了解决C语言命名冲突问题,C++引入了namespace这个关键字,用来定义一个命名空间域,其作用可以防止命名冲突问题。格式如下:

//name -- 名字随便取
namespace name
{
	int rand = 10000;
}

二、什么是域(部分)

2.1 全局域和局部域

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第4张图片

main函数外的变量a称为全局域,main函数内部的变量a则称为局部域。而且,以上的代码是可以编译成功的,因为不同的域可以定义同名变量,但相同的域不能定义同名变量;并且,当全局域和局部域命名冲突时,优先访问局部域,因此以上代码打印的结果为1(局部域)

2.2 命名空间域

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第5张图片

2.3 如何同时访问三个域的变量

  • 如果当全局域、局部域和命名空间域发生命名冲突,正常来说局部域是直接访问,但如果我还想访问全局域和命名空间域的变量,那该怎么做呢?

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第6张图片

  1. 全局域没什么好说的,直接访问
  2. ::域作用限定符。表示变量a去域作用限定符左边空白搜索,而这个空白代表的是全局域
  3. 同理的,若想访问命名空间域的变量,在域作用限定符前加上命名空间域的名字即可,表示的是变量awj这个域搜索变量

2.4 三种域访问的优先问题

当全局域、命名空间域和局部域同时存在,根据变量搜索原则,优先访问的是局部域

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第7张图片

其次优先访问全局域

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第8张图片

但是,它不会直接去命名空间搜索

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第9张图片

这就要涉及到如何访问命名空间域

2.5 访问命名空间域的方法

  • 指定方式(域作用限定符)

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第10张图片

  • 展开方式
    【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第11张图片

因此,C++中的using namespace std的意思就是展开标准库(std)的命名空间

三、使用using namespace的危害

注意:展开了就相当于暴露在全局环境下了(相当于全局变量)。因此,如果全局域也有一个命名相同的变量,就会产生命名冲突,也就报错了

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第12张图片

【总结】
从此可以看出,其实使用using namespace的效果也是不佳的,因为它把命名空间展开后,域中的变量就相当于全局变量,而命名空间域的意义就是为了防止命名冲突的。因此不能轻易使用using namespace
【建议】

  1. 建议在写项目不要使用using namespace,在项目中最好是指定一些常用的把它展开。比如:using std::cout
  2. 在日常练习写代码时,可以随意使用

四、命名空间的嵌套

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第13张图片

【结果展示】

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第14张图片

ps:嵌套可以存在有同名变量

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第15张图片

【结果展示】

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第16张图片

最后,同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。

【C++】你知道为什么在写C++代码之前要在开头写上using namespace std吗?_第17张图片

五、总结

本章是补充C语言语法的不足,以及C++是如何对C语言设计不合理的地方进行优化的。

你可能感兴趣的:(C++,c++,学习,visualstudio)