【C++指南】命名空间
💓 博客主页:倔强的石头的CSDN主页
📝Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:《C++指南》
期待您的关注
目录
一、命名空间的重要性
1. C语言中没有命名空间而存在的问题
2. C++引入了命名空间解决的问题
3. C++命名空间的重要性
二、命名空间的定义
三、命名空间的使用
1. 指定命名空间访问编辑
2. using将命名空间中某个成员展开
3. 展开命名空间中全部成员
注:本文为了将C与C++进行对比,皆使用了printf函数作为示例
一、命名空间的重要性
1. C语言中没有命名空间而存在的问题
在C语言中,所有的全局标识符(包括函数名、变量名等)都位于同一个全局作用域中。这导致了几个显著的问题:
命名冲突:当多个库或模块包含相同名称的函数或变量时,这些标识符之间会发生冲突。开发者需要手动修改名称以避免冲突,这既繁琐又容易出错。
代码可读性差:随着项目规模的增大,全局作用域中的标识符数量急剧增加,使得代码的阅读和维护变得困难。开发者需要花费更多时间来理解每个标识符的来源和用途。
模块间耦合度高:由于所有全局标识符都可见,模块间的依赖关系可能变得复杂且难以管理。这增加了代码重构和模块化的难度。
比如:
在C语言中,如果定义一个rand全局变量,刚开始,可以正常打印
然后,包含了<stdlib.h>头文件之后,就报错了,因为在stdlib头文件中,rand是函数,这里我们又定义了以rand全局变量,就产生了命名冲突
2. C++引入了命名空间解决的问题
C++通过引入命名空间(namespace)机制来解决上述问题:
解决命名冲突:命名空间允许开发者将相关的标识符组织在一起,并通过命名空间名称作为前缀来访问这些标识符。这样,即使不同的库或模块包含相同名称的标识符,只要它们位于不同的命名空间中,就不会发生冲突。
提高代码可读性:命名空间为代码提供了一种自然的分组方式,使得相关的标识符能够按照逻辑或功能进行组织。这有助于开发者快速理解代码的结构和每个标识符的用途。
降低模块间耦合度:通过限制命名空间成员的可见性,C++可以减少模块间的依赖关系。开发者可以更加灵活地重构和模块化代码,而无需担心意外的命名冲突或依赖问题。
还是上面的例子,在C++中,将rand全局变量放在了命名空间中后,就不会与头文件中rand函数发生冲突
关于命名空间的定义和使用细则,会在稍后介绍
3. C++命名空间的重要性
C++命名空间的重要性体现在以下几个方面:
支持大型项目:对于大型项目而言,命名空间是组织和管理代码的关键工具。它有助于减少命名冲突、提高代码可读性和可维护性。
促进模块化编程:命名空间鼓励开发者将代码划分为独立的模块或库,并通过命名空间来区分这些模块或库中的标识符。这有助于实现更加清晰和灵活的模块化编程。
与标准库集成:C++标准库中的所有内容都定义在
std
命名空间中。通过使用命名空间,标准库能够与用户代码和谐共存,而不会引发命名冲突。增强代码复用性:命名空间使得库和框架的开发者能够更容易地提供可复用的代码。通过定义清晰的命名空间,他们可以避免命名冲突,并确保库或框架中的标识符在与其他代码集成时保持清晰和一致。
总之,C++命名空间是一种强大的代码组织工具,它有助于解决命名冲突、提高代码的可读性和可维护性。通过合理使用命名空间,你可以创建出更加清晰、模块化和可复用的C++代码。
二、命名空间的定义
- 定义命名空间——需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
- namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。
- C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的生命周期;命名空间域和类域不影响变量生命周期,只影响作用域。
- namespace只能定义在全局,当然他还可以嵌套定义。
- 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突
- C++标准库都放在⼀个叫std(standard)的命名空间中
多文件定义同名的命名空间,它们会被当做是同一个命名空间,自动合并到一起
如下图所示:
三、命名空间的使用
编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。
所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:
- 指定命名空间访问,项⽬中推荐这种⽅式。
- using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
- 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。
1. 指定命名空间访问
2. using将命名空间中某个成员展开
3. 展开命名空间中全部成员
作为C++命名空间的基础介绍,本文讲解完毕
相关文章:

【C++指南】命名空间
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《C指南》 期待您的关注 目录 一、命名空间的重要性 1. C语言中没有命名空间而存在的问题 2. C引入了命名空间解决的问题 3.…...

RocketMQ Dashboard安装
RocketMQ Dashboard 是一个基于 Web 的管理工具,用于监控和管理 RocketMQ 集群。它提供了一个用户友好的界面,使管理员能够轻松地查看和操作 RocketMQ 系统中的各种组件和状态。 主要功能包括: 集群管理: 监控和管理 NameServer 和 Broker …...

前端web开发HTML+CSS3+移动web(0基础,超详细)——第3天
目录 一,列表-无序和有序的定义列表 二,表格-基本使用与表格结构标签 三,合并单元格 四,表单-input标签 五,表单-下拉菜单 六,表单-文本域 七,表单-label标签 八,表单-按钮 …...

认识MySQL
目录 数据库是什么呢?MySQL 数据库是什么呢? 在我们开始学习MySQL之前,先来了解一下,什么是数据库呢?我相信此时很多人会说是管理数据的,完全正确!用数据库我们可以去存储大量的数据。我来给你…...

尚品汇-创建ES索引库(二十七)
目录: (1)商品检索功能介绍 (2)根据业务搭建数据结构 (3)nested 介绍 (4)搭建service-list服务 (5)构建实体与es mapping建立映射关系 &…...

设计模式-六大原则
概述 设计模式的六大原则是设计模式的基础,了解设计模式的原则,有利于设计模式实际应用的理解,在真实使用的时候,一般不太可能一个程序满足所有的设计模式六大原则,或多或少都会有违背设计模的地方,所以不…...

MyBatis搭建和增删改查
MyBatis是一个开源的持久层框架,用于处理数据库的增删改查操作。它能够将Java对象与数据库中的数据进行映射关系的配置,并自动生成对应的SQL语句,从而简化了数据库操作的编码工作。 MyBatis的核心思想是将SQL语句与Java代码分离,…...

【一图学技术】6.反向代理 vs API网关 vs 负载均衡的原理和使用场景
反向代理 vs API网关 vs 负载均衡 一、概念 🌏反向代理(Reverse Proxy)是一种位于服务器和客户端之间的代理服务器。 它接收来自客户端的请求,并将其转发给后端服务器,然后将后端服务器的响应返回给客户端。客…...

python爬虫番外篇 | Reuqests库高级用法(1)
文章目录 1.会话对象(Session Objects)2.请求和响应对象(Request and Response Objects)3.准备好的请求(Prepared Requests)4.SSL证书验证5.客户端证书6.CA 证书7.正文内容工作流程(Body Conten…...

【链表OJ】常见面试题 3
文章目录 1.[环形链表II](https://leetcode.cn/problems/linked-list-cycle-ii/description/)1.1 题目要求1.2 快慢指针1.3 哈希法 2.[随机链表的复制](https://leetcode.cn/problems/copy-list-with-random-pointer/description/)2.1 题目要求2.2 迭代法 1.环形链表II 1.1 题目…...

Linux学习笔记9(Linux包管理)
目录 归档包管理 归档 查看归档包 解归档包 压缩包管理 Zip/unzip gzip/gunzip bzip2/bunzip2 源码包安装软件 三大步: 预备步骤:安装依赖的编译库 一、./configure --prefix/usr/local/nginx 二、make 三、make install 软件包安装 配置…...

论文阅读《Geometric deep learning of RNA structure》
引入了机器学习方法,通过少量的数据学习。只使用原子坐标作为输入。 预测RNA三维结构比预测蛋白质结构更困难。 设计了一个原子旋转等变评分器ARES,由每个原子的三维坐标和化学元素类型(输入)指定,ARES预测模型与未知真…...

宏集方案 | 传统建筑智能化改造,迈向物联新时代
前言 智能建筑涉及多个系统的集成,如照明、空调、安防等,这些系统的兼容性和协调运作是一大挑战。然而,传统的工业建筑和商业楼宇受早期设计的局限,多个控制系统间互不兼容,并且难以重新部署通信线缆。 针对传统建筑…...

如果服务器更改Web端口会减少被攻击的风险吗?
通过更改服务器的Web端口,是否能够显著降低被攻击的风险?首先,理解Web服务默认使用的端口是关键。HTTP协议通常使用80端口,而HTTPS则默认使用443端口。这些端口因其广泛认知而成为黑客攻击的首要目标。理论上,将Web服务迁移到非标…...

vim列编辑模式
在编辑文本时,经常会有这样的需求,对特定列进行进行批量编辑。比如批量注释一段代码,或者删除待定字符(如一列空格)。幸运的是VIM支持列编辑模式。 假设文本内容: Maximum length of a custom vocabulary…...

如何实现pxe安装部署
此实验环境:rhel7主机 一、kickstart自动化安装脚本 1、安装可视化图形 [rootlocalhost ~]# yum group install "Server with GUI" 2、关闭vmware dhcp功能(编辑-虚拟网络编辑器) 3、httpd 1、安装httpd服务 [rootlocalhost …...

机器学习常见模型
1、线性模型 线性模型是机器学习最基本的算法类型,它试图学到一个通过多个特征(属性)计算的线性组合来预测的函数,简单的线性回归形式如yaxb,其中,x代表特征,而y代表结果,一旦a和b的…...

【python案例】基于Python 爬虫的房地产数据可视化分析设计与实现
引言 研究背景与意义 房地产行业在我国属于支柱性产业,在我国社会经济发展中一直扮演着重要角色。房价问题,尤其是大中城市的房价问题,一直是政府、大众和众多研究人员关注的热点。如何科学地预测房价是房价问题的研究方向之一。随着互联网…...

如何在Python中诊断和解决内存溢出问题
python的内存溢出即程序在申请内存后未能正确释放,导致随着时间推移占用的内存越来越多,以下是一些可能导致内存溢出的原因: 1、循环引用:当对象之间形成循环引用,并且这些对象定义了__del__方法时,Python…...

什么是爬虫软件?这两个爬虫神器你必须要试试
爬虫软件概述 爬虫,又称为网络爬虫或网页爬虫,是一种自动浏览互联网的程序,它按照一定的算法顺序访问网页,并从中提取有用信息。爬虫软件通常由以下几部分组成: 用户代理(User-Agent)…...

记录|MVS和VM软件使用记录
目录 前言一、常用属性二、触发模式选择三、操作注意点四、录像、抓拍功能五、VM软件六、VM软件界面介绍七、VM软件运行间隔八、VM软件图像源九、VM软件相机管理十、获取图像十一、方案存储十一、相机拍摄彩图转换颜色转换快速匹配特征模板:运行参数 十二、位置修正…...

算法通关:014_1:用栈实现队列
文章目录 题目总结代码运行结果 题目 用栈实现队列 leetcode :232 总结 时间复杂度 平均下来每个方式是O(1) 代码 class MyQueue {public Stack<Integer> in;public Stack<Integer> out;//初始化public MyQueue() {in new Stack<>();out new Stack<…...

【C#】Random
在 C# 中,Random 类的实例通常用于生成随机数。在方法内部或外部创建 Random 实例主要影响的是实例的生命周期和性能。 在方法外部创建 Random 实例 生命周期:如果在类的成员变量中创建 Random 实例,那么这个实例的生命周期将与类的实例相同…...

MongoDB简介及其在Java中的应用
什么是MongoDB? MongoDB是一个基于分布式文件存储的数据库,由C语言编写。它旨在为Web应用提供可扩展的高性能数据存储解决方案。MongoDB结合了关系数据库和非关系数据库(NoSQL)的特点,是功能最丰富、最像关系数据库的…...

JSON-LD上下文将属性映射到RDF IRIs示例
为了更清晰地说明JSON-LD上下文是如何将属性映射到RDF IRIs,我们可以基于提供的上下文规范,举一个完整的JSON-LD数据实例,并展示它是如何转换为RDF三元组的。 示例上下文 {"context": {"foaf": "http://xmlns.com…...

Spring的监听机制详解
Spring的监听机制详解 讲在前面 对Spring框架,大家都已不陌生,它给我们提供了很多功能,包括IoC、AOP、事务管理等。其中,Spring的事件监听机制是一项非常重要的功能,它允许开发人员定义和处理自定义事件,并…...

Cache结构
Cache cache的一般设计 超标量处理器每周期需要从Cache中同时读取多条指令,同时每周期也可能有多条load/store指令会访问Cache,因此需要多端口的Cache L1 Cache:最靠近处理器,是流水线的一部分,包含两个物理存在 指…...

国产版Sora复现——智谱AI开源CogVideoX-2b 本地部署复现实践教程
目录 一、CogVideoX简介二、CogVideoX部署实践流程2.1、创建丹摩实例2.2、配置环境和依赖2.3、上传模型与配置文件2.4、开始运行 最后 一、CogVideoX简介 智谱AI在8月6日宣布了一个令人兴奋的消息:他们将开源视频生成模型CogVideoX。目前,其提示词上限为…...

怎么读取FRM、MYD、MYI数据文件
一、介绍frm、MYD、MYI文件 在MySQL中,使用MyISAM存储引擎时,数据库表会被分割成几个不同的文件文件描述功能扩展名FRM 文件表结构定义文件存储表的结构信息,字段、索引等.FRMMYD 文件数据文件包含表的实际数据.MYD(MYData&#x…...

Leetcode3226. 使两个整数相等的位更改次数
Every day a Leetcode 题目来源:3226. 使两个整数相等的位更改次数 解法1:位运算 从集合的角度理解,k 必须是 n 的子集。如果不是,返回 −1。怎么用位运算判断,见上面的文章链接。 如果 k 是 n 的子集,…...