探索C嘎嘎的奇妙世界:第一关---命名空间

       1:命名空间

        C++就是延续C语言的一些不足进行改进和优化,也是一门值得我们深入探索和钻研的编程语言。它就像一个充满宝藏的宝库,等待着我们去发掘其中的奥秘和惊喜.那么就让我们来打开C++的大门,进行探索吧!!!

        首先,C++要在C语言优化的第一个问题:命名冲突, 那么C语言是具体怎么冲突的呢?请看下述代码:

#include<stdio.h>int rand = 1;int main()
{printf("%d\n", rand);return 0;
}

        在上述代码中,可以看到我们定义了一个全局的整形变量:rand并赋值为1:然后在main函数中进行打印,显而易见会打印出一个大大的"1",那么有小伙伴就要问了,命名冲突在哪呢?别急,请看下述代码:

#include<stdio.h>
#include<stdlib.h>int rand = 1;int main()
{printf("%d\n", rand);return 0;
}

         在上述代码中,我们只是多包含了一个头文件<stdlib.h>,这会有什么区别呢?勤于动手的小伙伴会发现这样的代码在我们本地的IDE上会报错,咦~那是为什么呢?

        细心的小伙伴会发现"rand"这个变量名字有点熟悉啊,这不就是生成伪随机数的rand函数吗?而此时我们又悄然的包含了rand函数的头文件,哦!!!真相只有一个,这样写的话,你想让它打印的是<stdlib.h>库里面的rand函数呢?还是全局里的rand的整形变量呢?这时IDE没有了唯一打印路径,就会分歧,从而报错了,到此真相大白了.

1.1 命名空间定义:

        那么应该怎么解决呢?这时我们C++祖师爷Bjarne Stroustrup博士就发现并解决了这个问题,怎么解决的呢?接下来就引入我们的主题------命名空间

        在学习命名空间之前,我们要认识一下它的关键字"namespace",多说无意,请看示例代码:

#include<stdio.h>
#include<stdlib.h>namespace MyNamespace
{int rand=1;
}int main()
{printf("%d\n",rand);//  rand函数的地址printf("%d\n",MyNamespace::rand);//  1 return 0;
}

         这里我们定义了一个名为"MyNamespace"的命名空间,那么它是如何解决命名冲突的问题呢?让我来一一揭晓:

        在"MyNamespace"的命名空间中我们也定义了一个rand的整形变量,并赋值为1,以作区分.这时我们继续包含<stdlib.h>的头文件,这时我们上述代码中的第一处打印就不存在分歧了,打印的就是rand函数的地址数据了,

        在介绍第二处打印时要先介绍一个全新的操作符"::"作用域解析运算符,那么它是怎么使用的呢?,很简单:"命名空间的名字+要访问的元素''在上述代码中,我们这样写"MyNamespace::rand"就是要访问名为MyNamespace的命名空间中的rand元素.

        那么这样的话就和<stdlib.h>库中的rand函数就分开了,问题也就解决了

1.2 命名空间使用 :

        命名空间作用就这吗?当然不止于此啦,在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染namespace关键字的出现就是针对这种问题,除此之外:命名空间中可以定义变量/函数/类型,那么具体怎么用呢,上代码:

namespace MyNamespace
{// 命名空间中可以定义变量/函数/类型int rand = 10;int Add(int left, int right){return left + right;}    struct Node{struct Node* next;int val;};
}

        命名空间中还可以写入函数和结构体等等等...当然命名空间还可以进行嵌套:

namespace N1
{int a;int b;int Add(int left, int right){return left + right;}namespace N2{int c;int d;int Sub(int left, int right){return left - right;}}
}

在上述代码中:我们在N1的命名空间中,嵌套了一个N2的命名空间:

ps:1:同一个工程中允许存在多个相同名称的命名空间 , 编译器最后会合成同一个命名空间中。
     2:一个工程中的 test.h 和上面 test.cpp 中两个 N1 会被合并成一个

相同的名字的命名空间编译器会自动合并哦~:

        需要注意的是:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中          

        当我们要多次使用"::"作用域解析运算符,一直这样写会有点烦,那么我们就要介绍下一个关键字"using"展开命名空间,它的作用是什么呢?

//使用using namespace 命名空间名称 引入
using namespce N;
int main()
{printf("%d\n", N::a);printf("%d\n", b);Add(10, 20);return 0;    
}//使用using将命名空间中某个成员引入
using N::b;
int main()
{printf("%d\n", N::a);printf("%d\n", b);return 0;    
}

        在上述代码中:using namespce N;可以将命名空间N:进行展开,当我们多次访问命名空间中的数据时就不用一直使用"::"这个操作符了.

        当然,我们还可以不完全展开这个命名空间中的所有数据,可以只展开其中的某个类型/变量/函数,这样已达到精确的目的.使用“using namespace namespace_name;”可以将指定命名空间中的所有标识符引入到当前作用域,这样在当前作用域中就可以直接使用该命名空间中的元素而无需添加命名空间前缀。但过度使用可能导致命名冲突风险增加(建议少用全部展开,特别是在公司中多人协助做项目时,防止命名冲突)

        到此有关命名空间的所有有关知识都详细的讲述了一遍,希望这篇博客能给您带来一些启发和思考!那我们下次再一起探险喽,欢迎在评论区进行讨论~~~

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

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

相关文章

探索未来工作新伙伴:机器人流程自动化(RPA)揭秘

想象一下&#xff0c;如果你的日常工作中那些繁琐、重复的任务&#xff0c;比如数据录入、文件整理、邮件发送等&#xff0c;都能自动完成&#xff0c;你将拥有更多时间专注于真正需要创造力和智慧的工作&#xff0c;是不是听起来就像拥有了一个私人助理&#xff1f;这并不是遥…

VUE3版本新特性

VUE3版本新特性 VUE3和VUE2的区别路由的使用vite安装项目新特性使用 1.VUE3和VUE2的区别 2020年9月18日&#xff0c;Vue.js发布版3.0版本&#xff0c;代号&#xff1a;One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。…

推荐 3 款小巧的文件压缩、投屏和快速启动软件,请收藏,避免找不到

Maya Maya是一款由博主25H开发的体积小巧、简单易用的快速启动工具。它的操作逻辑和界面设计几乎复刻了Rolan早期版本&#xff0c;功能上与Rolan几乎别无二致。Maya支持多文件拖拽添加启动、快捷键呼出、自动多列显示等功能。此外&#xff0c;Maya还具备lnk文件解析功能。 May…

多目标粒子群算法(MOPSO):原理讲解与代码实现 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 粒子群算法 多目标粒子群算法 一、外部档案…

059、Python 函数练习:用函数实现求两个数的最大公约数和最小公倍数

普及&#xff1a;写程序有两个终极原则&#xff1a;高内聚&#xff0c;低耦合。 所谓高内聚指的是一个模块或类内部各个元素&#xff08;方法、属性等&#xff09;彼此关联紧密&#xff0c;共同完成一个特定的任务或目标。具有高内聚的模块或类内的元素之间联系紧密&#xff0…

JDBC和数据库连接池

JDBC配置文档 数据库文档链接ssl配置文档PostgresInitializing the Driver | pgJDBCInitializing the Driver | pgJDBCMySQLMySQL :: MySQL Connector/J Developer GuideMySQL :: MySQL Connector/J Developer Guide :: 6.3 Configuration Properties java数据库连接池配置文档…

Android11 以Window的视角来看FallbackHome的启动

在WMS中&#xff0c;使用WindowState代表着一个Window并维护着一个Window的"层级树"&#xff0c;每个Window需要按照"层级"的规则进行排列。对于FallbackHome&#xff0c;其Window是挂载在home task上&#xff0c;而home task挂载在DefaultTaskDisplayArea…

python之日志(三)--将捕获的异常写入日志中

1.日志级别 import logging #日志模块 #默认下只会从第3级开始打印 logging.debug(DEBUG级别) #1级 logging.info(INFO级别) #2级 logging.warning(WARNING级别) #3级 logging.error(ERROR级别) #4级 logging.critical(CRITICAL级别) #5级 默认第1和第2级的日志不会打印 …

解决 uniapp h5 页面在私有企微iOS平台 间歇性调用uni api不成功问题(uni.previewImage为例)。

demo <template><view class"content"><image class"logo" src"/static/logo.png"></image><button click"previewImage">预览图片</button></view> </template><script> //打…

CentOS7安装ZooKeeper3.7.1集群

目录 前提条件 集群规划 安装步骤 下载zookeeper-3.7.1安装包 解压 同步至其他机器 配置环境变量&#xff08;所有机器都执行&#xff09; 配置服务器编号 配置zoo.cfg 分别启动zk服务 查看zk状态 进入zk客户端命令行测试 ZK集群启动停止脚本 前提条件 具备三台C…

React@16.x(32)useDebugValue

目录 1&#xff0c;介绍2&#xff0c;作用 1&#xff0c;介绍 从一个例子开始&#xff1a; export default function App() {const [n, setN] useState(0);const refH1 useRef();useEffect(() > {console.log("父组件");});return <h1 ref{refH1}>{n}&l…

使用 imu_utils 、Kalibr 工具进行IMU和相机内外参外参标定

文章目录 一、问题描述二、imu_utils 工具的使用1. 安装1.1 下载与编译1.2 编译bug解决 2. 标定 IMU2.1 imu bag包录制2.1.1 imu 数据格式2.1.2 imu 数据录制 2.2 imu 标定 三、Kalibr 工具的使用1. 安装1.1 下载与编译1.2 问题解决 一、问题描述 vins系列安装完成后&#xff…

首页IP代理科普 住宅IP与普通IP的区别

在互联网连接中&#xff0c;IP地址是识别每个网络节点的关键。在众多类型的IP地址中&#xff0c;住宅IP和普通IP是两种常见的分类。本文将深入探讨住宅IP与普通IP之间的主要区别。 一、定义与来源 住宅IP指的是由互联网服务提供商&#xff08;ISP&#xff09;直接分配给家庭或…

EasyRecovery电脑数据恢复软件2024数据守护神#误删文件神器#硬盘恢复利器#数据丢失救星

&#x1f310; 你是否曾经因为误删文件、硬盘损坏等原因&#xff0c;失去了重要的数据&#xff1f;别担心&#xff0c;EasyRecovery电脑数据恢复软件是你的救星&#xff01;它能够帮你找回丢失的文件&#xff0c;让你的数据重新焕发生机。 &#x1f50d; EasyRecovery软件的核…

有关健身的俄语表达,柯桥零基础俄语培训

фитнес 健身 тренер 教练 абонемент 会员卡 аэробика 有氧运动 анаэробика 无氧运动 плавание 游泳 пробежка / бег трусцой 慢跑 беговая дорожка 跑步机 йога 瑜伽 коври…

redis击穿问题使用锁实现方案

解决Redis缓存击穿问题的一种常见方法是使用互斥锁。以下是一个使用Java编写的简单示例&#xff0c;展示了如何利用Redis的SET命令加上NX&#xff08;仅在键不存在时设置&#xff09;和EX&#xff08;设置键的过期时间&#xff09;选项来实现分布式锁&#xff0c;以防止缓存击穿…

MCU嵌入式AI开发笔记-视频笔记同步更新

MCU嵌入式AI开发笔记 抖音B站等站点笔记视频同步更新 01嵌入式AI大的方向 STM32跑神经网络 http://news.eeworld.com.cn/mp/EEWorld/a134877.jspx 为什么可以在STM32上面跑神经网络?简而言之就是使用STM32CubeMX中的X-Cube-AI扩展包将当前比较热门的AI框架进行C代码的转化,…

安卓开发serizeable和parcelble的区别

在Android开发中&#xff0c;Serializable和Parcelable是两种常见的用于对象序列化的接口。它们的主要区别在于性能、使用的复杂性和适用场景。以下是它们的详细比较&#xff1a; 1. Serializable Serializable是Java标准库中的一个接口&#xff0c;用于将对象序列化为字节流…

持续学习的综述: 理论、方法与应用

摘要 为了应对现实世界的动态&#xff0c;智能系统需要在其整个生命周期中增量地获取、更新、积累和利用知识。这种能力被称为持续学习&#xff0c;为人工智能系统自适应发展提供了基础。从一般意义上讲&#xff0c;持续学习明显受到灾难性遗忘的限制&#xff0c;在这种情况下…

【Linux硬盘数据读取】WIN10访问linux分区解决方案:ext2fsd

<div id"content_views" class"htmledit_views" style"user-select: auto;"><p>尝试ext2explore、Paragon ExtFS都不好用&#xff0c;强烈安利ext2fsd&#xff0c;可读写&#xff0c;很强大</p> 转自&#xff1a;https://blog…