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

news2025/1/14 2:07:33

在这里插入图片描述

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


标题

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

一、问题引入

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

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

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

二、什么是域(部分)

2.1 全局域和局部域

在这里插入图片描述

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

2.2 命名空间域

在这里插入图片描述

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

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

在这里插入图片描述

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

2.4 三种域访问的优先问题

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

在这里插入图片描述

其次优先访问全局域

在这里插入图片描述

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

在这里插入图片描述

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

2.5 访问命名空间域的方法

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

在这里插入图片描述

  • 展开方式
    在这里插入图片描述

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

三、使用using namespace的危害

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

在这里插入图片描述

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

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

四、命名空间的嵌套

在这里插入图片描述

【结果展示】

在这里插入图片描述

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

在这里插入图片描述

【结果展示】

在这里插入图片描述

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

在这里插入图片描述

五、总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/444040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何设计一个高并发系统

目录 如何理解高并发系统 1. 分而治之&#xff0c;横向扩展 2. 微服务拆分&#xff08;系统拆分&#xff09; 3. 分库分表 4. 池化技术 5. 主从分离 6. 使用缓存 7. CDN——加速静态资源访问 8. 消息队列——削锋 9. ElasticSearch 10. 降级熔断 11. 限流 12. 异步…

算法刷题总结 (八) 前缀和

算法总结8 前缀和 一、前缀和的概念1.1、什么是前缀和&#xff1f;1.2、常见类型1.2.1、求数组前i个数之和1.2.2、求数组的区间和 二、经典例题2.1、求数组前i个数之和560. 和为 K 的子数组 - 前缀和哈希表525. 连续数组 2.2、求数组的区间和303. 区域和检索 - 数组不可变643. …

学系统集成项目管理工程师(中项)系列06b_信息系统安全管理(下)

1. 物理安全管理 1.1. 计算机机房与设施安全 1.1.1. 计算机机房 1.1.1.1. 机房场地选择 1.1.1.2. 机房空调、降温 1.1.1.2.1. 基本温度要求 1.1.1.2.1.1. 应有必要的空调设备&#xff0c;使机房温度达到所需的温度要求 1.1.1.2.2. 较完备空调系统 1.1.1.2.2.1. 应有较完…

C语言——隐式转换

目录 前言 隐式转换 1.整型提升 2.算数转换 前言 这里小编给大家简单的补充一下&#xff0c;一些有关C语言的知识点 隐式转换 由于转换形式的不同类型转换这里一共分为整型提升和运算转换两种形式 1.整型提升 在了解整型提升之前&#xff0c;这里我们需要先了解一下截断…

自媒体助手软件开发需具备哪些功能?

自媒体助手软件开发需具备哪些功能&#xff1f; 1、多平台多账号管理。 用户可以在单独的平台上管理其他平台的账号&#xff0c;不需要登录多个平台&#xff0c;为用户减少了大量的时间&#xff0c;与此同时可以记忆账号和密码&#xff0c;提供分组管理&#xff…

【C进阶】详解预处理指令

文章目录 预定义符号#define#define定义标识符#define定义宏#define替换规则#和##带副作用的宏参数宏和函数对比#undef命令行定义 条件编译文件包含头文件被包含的方式嵌套文件包含 其他预处理指令总结 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DA…

解码星地一体农机导航:无网作业,极致

星地一体系列农机导航最强大之处是在全国任何地方都拥有信号&#xff0c;即使是在偏远的戈壁滩也能作业&#xff0c;因为星地一体系列导航采用星地融合技术&#xff0c;彻底解决信号问题&#xff0c;通过卫星播发差分信号的服务&#xff0c;在中国&#xff0c;只要可见卫星&…

Windows下如何查看某个端口被谁占用被杀死占用进程

开发时经常遇到端口被占用的情况&#xff0c;这个时候我们就需要找出被占用端口的程序&#xff0c;然后结束它&#xff0c;本文为大家介绍如何查找被占用的端口。 1、打开命令窗口(以管理员身份运行) 开始—->运行—->cmd&#xff0c;或者是 windowR 组合键&#xff0c;…

Win10桌面我的电脑怎么调出来?最简单方法教学

Win10桌面我的电脑怎么调出来&#xff1f;有用户发现自己的电脑桌面没有我的电脑这个程序图标&#xff0c;每次要访问磁盘的时候&#xff0c;开启都非常的麻烦。那么怎么将这个图标设置到桌面显示呢&#xff1f;接下来我们一起来看看以下的解决方法吧。 方法一&#xff1a; 在开…

论文中参考文献的引用

论文中参考文献的引用 写在最前面删除特定格式的数字&#xff08;带小中大括号等等&#xff09;效果如下 设置参考文献格式设置编号格式设置段落格式效果 使用交叉引用去引用这些编号在需要插入参考文南引用的地方使用“交叉引用”快捷键进阶:为“交叉引用”设置快捷键 写在最前…

maven安装及配置IDEA

文章目录 下载下载完成后 解压可以得到如下的目录项 配置环境变量输入下列命令 出现 maven版本表示环境变量配置成功 配置本地仓库、镜像仓库、jdk版本配置本地仓库配置镜像仓库配置jdk版本 IDEA配置maven配置当前项目的maven配置其他项目的maven 下载 https://maven.apache.o…

威联通NAS文件共享 - 搭建SFTP服务并内网穿透实现在外远程访问

文章目录 前言1. 威联通NAS启用SFTP2. 测试局域网访问3. 内网穿透3.1 威联通安装cpolar内网穿透3.2 创建隧道3.3 测试公网远程访问 4. 配置固定公网TCP端口地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址4.3 测试使用固定TCP端口地址远程连接威联通SFTP 转载自远程内…

Java web 项目 和 java 项目的区别

一、Java Web项目 和 java项目区别 1. Java Web项目是基于Java EE类的&#xff1b;而Java项目是基于Java应用程序的。 2. Java Web项目是网页的编码&#xff0c;像jsp,servlet,struts这类的&#xff0c;而java项目是AWT,SWING这类的编码。 3. Java Web项目中的JAVA文件是tomcat…

【CocosCreator入门】CocosCreator组件 | Layout(布局)组件

Cocos Creator 是一款流行的游戏开发引擎&#xff0c;具有丰富的组件和工具&#xff0c;其中的Layout组件是一种用于实现节点自适应布局的重要组件。它可以根据不同的布局方式&#xff0c;自动调整子节点的位置和大小&#xff0c;从而实现节点的自适应布局。 目录 一、组件介绍…

准备换工作的看过来~

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到理想…

运行时内存数据区之方法区(二)

方法区的演进细节 首先明确&#xff1a;只有HotSpot才有永久代。BEA JRockit、IBMJ9等来说&#xff0c;是不存在永久代的概念的。原则上如何实现方法区属于虚拟机实现细节&#xff0c;不受《]Va虚拟机规范》管束&#xff0c;并不要求统一。Hotspot中方法区的变化&#xff1a; …

Spring核心-IoC控制反转详解 (典藏版)

文章目录 1.IoC容器和Bean介绍2.Spring 中的 IoC 容器2.1 BeanFactory和ApplicationContext概述2.2 BeanFactory2.3 ApplicationContext2.4 BeanFactory vs ApplicationContext2.5 容器的初始化2.6 配置元数据2.6.1 基于XML的容器配置2.6.2 基于注解的容器配置2.6.3 基于Java类…

Junit概述和快速入门

单元测试概述 在程序中&#xff0c;一个单元可以是一个完整的模块&#xff0c;但它通常是一个单独的方法或者程序 在面向对象的编程中&#xff0c;一个单元通常是整个界面&#xff0c;例如类&#xff0c;但可能是单个方法 JUnit是一个java编程语言的单元测试框架 通过先为最…

教育大数据总体解决方案(4)

组件配置 对组件中的项目配置项进行管理&#xff0c;包括节点内容、磁盘空间等等。每一次的配置都以一个配置版本的形式进行保存&#xff0c;用户可选择对应版本的查看对应的配置信息。 测度 对组件内的相关服务指标以图标形式进行状态呈现。可选择相应时间段&#xff0c;查看对…

scala闭包与柯里化

目录 通过闭包实现一个通用的两数相加函数简化柯里化 闭包&#xff1a;如果一个函数&#xff0c;访问到了它的外部&#xff08;局部&#xff09;变量的值&#xff0c;那么这个函数和他所处的环境&#xff0c;称为闭包 通过闭包实现一个通用的两数相加函数 这里内层函数访问了外…