c++之命名空间详解(namespace)

引例

在学习之前我们首先了来看这样一个情形:

在c语言下,我们写了两个头文件:链表和顺序表的。我们会定义一个type(typedef int type)方便改变数据类型(比如将int改成char),来做到整体代换。

但是我们两个头文件里面都有type,我们又同时引用两个头文件,就会导致type重定义。而解决办法就要宏条件,所以很麻烦修改。

命名空间

那么我们今天学的东西就可以解决以上问题。

首先我们要了解一个基础知识,我们代码只会查看公共空间(全局,和局部),对于创建的空间是没有权限访问的

关键词 namespace

这个是命名空间的意思,因为我们在写代码的时候,定义的变量、函数、类都可能会相同,有报错的风险,所以我们就可以将他们放到不同的空间里面,将它面隔离开来。

我们看以下代码

这里有两个参数一样的add函数,系统肯定会报错,因为不知道用哪个,那么我们就可以将其中一个用命名空间包括起来

命名空间的创建

以上就是我们创建的命名空间叫dgj

这个空间里面有整形a,函数add

那么就只能访问下面的add和局部变量a。

如果我们要访问dgj里面的东西怎么办呢?

空间限定操作符 ::

我们只要在对于变量、函数、类之前加上“命名空间::”就可以限定空间了

我们之前的结果是

将代码改成

那么就会变成

另外对于一下函数我们如何访问全局变量a呢?

我们只要这样就行

如果::之前没有命名空间,那么就是指的全局空间。

标准命名空间 

我们在引用官方头文件的时候,我们自己写的函数也有可能和官方函数有重名,那么我们的也有官方命名空间std(standard)来区分。自行观察我们就可以发现我们用到官方的cout和endl函数都必须要加std::它们不属于全局空间和局部空间,如果不加限定是访问不到的。

命名空间的合并性

我们写头文件一般有.h和.cpp两个文件,那么为了防止重名我们两个文件都要被命名空间括起来。

是不是要定义两个命名空间呢?不是,我们只要定义一个命名空间,编译器会自动把它当作整体。

那不然我们的官方头文件有很多,官方命名空间就不是一个std了。

在同一个文件里面也可以写多个相同名字的命名空间,也是当作一个命名空间

命名空间的展开

我们可能经常用某个命名空间,一直用“命名空间::”不是很方便,所以我们可以直接展开某个命名空间,那么接下来的代码的变量、函数、类就会优先使用这个命名空间的,除非用“命名空间::”指明是其他命名空间的。

语法就是(以std为例)

那么在下面的代码我们就会默认使用std命名空间的,里面的cout、endl也不需要用::来限定空间。

注意:这里的展开和我们头文件的展开是不同的,我们学过文件的编译链接就知道我们的头文件是在预编译展开成代码插入到我们的代码里面的。但是我们的命名空间并不是展开成什么代码,只是一种虚拟的展开。

单独展开命名空间里面的某一个变量、函数、类

但是我们直接展开一个比较大的命名空间,也是会有可能出现重定义的,特别是在以后的工作里面。所以我们可以只展开某个常用命名空间的某一个。

例如我们用dgj这个命名空间来举例:

那么下面的变量a就是优先使用命名空间dgj里面的东西。而出了这个以外的东西就不是默认使用的。

命名空间的嵌套

命名空间是可以在命名空间里面定义的,举例:

这个命名空间就有两个子命名空间。

如果要使用就是

或者只是用其中的一个

或者不展开,我们只是限制命名空间:

就是像剥洋葱一样一层一层向里。

类的命名空间举例

另外我这里举例类的相关例子:

这里的类也是一个对应的命名空间,那么我们可以限定空间来操作里面的变量、函数等。

命名空间的实际运用

例如一个公司要搞一个项目,然后项目肯定要分项目组,比如美术页面,底层逻辑等等,最后这些项目是要合到一起的。所以为了防止重定义,就让这几个项目组创建自己的命名空间例如A,B,C,D...

然后在项目A里面就会有很多人,为了防止这些人的命名重复导致重定义,那么每个人都会有一个命名空间,这里也体现了嵌套命名空间的意义。

那么通过上面的操作,我们就可以完美的避免合代码时出现重定义等相关错误。

看到最后了,觉得不错的就点个赞吧🙂

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

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

相关文章

python实现接口自动化

代码实现自动化相关理论 代码编写脚本和工具实现脚本区别是啥? 代码: 优点:代码灵活方便缺点:学习成本高 工具: 优点:易上手缺点:灵活度低,有局限性。 总结: 功能脚本:工…

【C++】BMP图片结构深度解析及其在C++中的操作与应用

引言 BMP(Bitmap Image File)是一种与设备无关的图像文件格式,它采用了一种非常直接的方式来存储图像数据,即按照图像的行和列顺序,逐像素地存储颜色值。由于其简单性和可移植性,BMP文件在图像处理、图像分…

windows电脑桌面便签在哪里找?

在忙碌的工作中,我们经常会有很多事情需要记住。这时,电脑桌面便签就成为了我们的好帮手。那么,在Windows电脑上,我们该如何找到桌面便签呢?下面,就让我来为大家详细介绍一下。 其实,Windows电…

Failed building wheel for pyaudio Running setup.py clean for pyaudio

从错误信息来看,问题出在 pyaudio 包的构建过程中。具体来说,缺少 portaudio.h 头文件,这通常是因为系统上没有安装 portaudio 库。 以下是解决此问题的步骤: 安装系统依赖: 在大多数基于 Debian 的系统(如…

elementui的table的@selection-change阻止事件改变

说明: 最近有个不想说的(xxx)业务,在表格勾选每一行的时候要触发一系列查询功能,查询失败还要把那个勾勾回退。真实蛋疼!表格勾选的默认selection-change是change事件,一般change事件是在完成之…

数据库的操作

【一】库的增删改查 【0】导入数据文件 source D:\bjpowernode.sql 【1】创建数据库 语法: create database [if not exists] 数据库名 [character set 编码字符集]; create databases db1; # 设置库的默认编码 create databases db1 charsetgbk; 【2】查看数据…

Argo怎么使用?

Argo是一款基于Kubernetes的开源工作流引擎,用于创建、调度和监控容器化工作流。以下是关于Argo使用的基本步骤和要点: 1. **安装Argo** - 首先,确保已经安装了Kubernetes集群,并且拥有kubectl命令行工具的访问权限。 - 使用kubec…

告别盲目跟风!1688竞品数据分析实战指南(图文解析)

不管是哪个行业,想把这个做起来,做下去,第一就要学会模仿,不要自己盲目瞎做,因为别人的数据,都是得到了认可的,先模仿后超越,1688运营里面模仿就是要学会看竞品,店雷达总…

【spring boot项目】统一返回结果封装

ResultCode.java package cn.clz.rental.utils; /*** 定义HTTP状态码常量* 这些常量用于表示不同类型的HTTP响应状态。*/ public class ResultCode {// 表示请求成功的状态码public static final Integer SUCCESS 200;// 表示服务器内部错误的状态码public static final Inte…

基于AD8232的心电图套件的测试

基于AD8232的心电图套件的测试 1、测试设备2、电源的选择3、 用于测试心电图套件的模拟心电图电路基本4017B的电路基于multisim的电路仿真基于STM32F103RCT6 参考测试数据 1、测试设备 1、AD8232心电模块 2、手持示波器 3、心电信号模拟发生器 4、NI multisim 14.3 5、实物待补…

django后台定制

Django 后台(Admin)是一个强大的工具,用于管理 Django 项目中的数据模型。然而,默认的 Django Admin 可能无法满足所有项目的需求,因此经常需要进行定制。以下是一些关于 Django 后台定制的推荐、介绍以及技术实现的建…

基于BERT的大规模文本处理实战

1. 引言 ChatGPT4相比于ChatGPT3.5,有着诸多不可比拟的优势,比如图片生成、图片内容解析、GPTS开发、更智能的语言理解能力等,但是在国内使用GPT4存在网络及充值障碍等问题,如果您对ChatGPT4.0感兴趣,可以私信博主为您解决账号和环…

英语口语中just的各种含义用法解析

文章目录 英语口语中"Just"的各种含义与用法解析1. 表示时间的近义1.1 刚刚完成的动作1.2 紧接着要发生的动作 2. 用于强调2.1 强调事实2.2 强调公正或合理性 3. 用作限定词3.1 限定数量或范围3.2 限定意见或观点 4. 表示简单或纯粹4.1 表达无关紧要的事4.2 描述纯粹…

达梦数据库系列—23. DSC集群搭建

目录 DSC搭建 1、环境准备 1.硬件 2.存储设备 3.操作系统 4.网络配置 5.防火墙 6.Selinux检查 7.用户准备 8.目录规划 9.软件安装 10.磁盘准备 2、搭建两节点 DMDSC 1.准备配置文件 dmdcr_cfg.ini 2.使用 DMASMCMD 工具初始化所有磁盘 3.使用 dmdcr_cfg.ini 配…

全卷积网络之FCN图像语义分割

前言 FCN是一种用于图像语义分割的全卷积网络,可以端到端进行像素级预测。 语义分割 图像语义分割是图像处理和机器视觉技术中的重要一环,旨在对图像中的每个像素进行分类。与普通的分类任务不同,语义分割任务输出与输入大小相同的图像&…

C#跨线程访问控件以及方法

在C#中,如果需要跨线程访问控件或调用方法,通常需要考虑到UI线程和后台线程之间的调度问题。以下是一些常见的方法: 1. 使用 Control.Invoke 或 Control.BeginInvoke 在WinForms或WPF应用程序中,如果在非UI线程中访问控件或调用UI相关方法,可以使用 Control.Invoke 或 C…

鸿蒙语言基础类库:【@ohos.uri (URI字符串解析)】

URI字符串解析 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 导入…

亿康源精英盛宴暨亿康源启动成功举办

(本台记者报)2024年7月7日下午,亿康源精英盛宴暨启动仪式在杭州市中维歌德大酒店盛大举行。此次盛会不仅吸引了行业内的专业人才、著名投资界大咖和科技领域的杰出企业家,还汇聚了众多关注大健康产业的各界人士,共同见…

软件设计之Java入门视频(13)

软件设计之Java入门视频(13) 视频教程来自B站尚硅谷: 尚硅谷Java入门视频教程,宋红康java基础视频 相关文件资料(百度网盘) 提取密码:8op3 idea 下载可以关注 软件管家 公众号 学习内容: 该视频共分为1-7…

【在线词典】项目实现

15_Dictionary 在线词典 搭建客户端-服务器架构 准备必要的资源 整理原始数据 整理英汉双语对照表,将XLSX格式转换成CSV格式,准备好vocabulary_list.csv文件备用 注意:CSV格式的文件必须使用UTF-8的字符集; 建立mydatabase.…