命名空间【C++】(超详细)
文章目录
- 命名空间的概念
- 命名空间的定义
- 命名空间定义的位置
- 作用域
- 每一个命名空间都是一个独立的域
- 作用域符::
- 编译器找一个变量/函数等的定义,寻找域的顺序
- 为什么要有命名空间?
- 1.解决库与程序员定义的同名的重定义问题
- 2.解决程序员与程序员之间可能定义同名变量/函数等的问题
- 命名空间中定义的东西的生命周期
- 如果命名空间的名字重名
- 展开命名空间
- 展开命名空间中的某一成员
- 命名空间重命名(取别名)
命名空间的概念
命名空间是用来组织和重用代码的
如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象
对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有重定义的问题
为了解决这个问题,引入了命名空间这个概念,通过使用
namespace xxx:你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。
命名空间的定义
语法:命名空间关键字(namespace)+命名空间的名字+{ 定义的东西 }
例:
namespace My
{int malloc = 10;int b = 0;void dfs();
}
命名空间中可以定义很多类型的东西
如 变量,函数,结构体,类,其他的命名空间等等
只要可以定义的东西都可以放到命名空间中定义
命名空间定义的位置
命名空间只能在全局或者另一个命名空间中定义
作用域
C++中的作用域主要有以下4种:
局部作用域:这是最常见的类型,它表示在特定函数或代码块(如if语句、for循环、while循环、switch语句等
被{}包括的)内的变量。
局部变量在它们被声明的代码块或函数内有效,当代码块或函数结束时,它们就会被销毁。文件作用域:在C++中,一个源文件可以包含多个源代码文件。这些源代码文件中的变量和函数通常具有文件作用域。这意味着它们只在包含它们的文件中有效,当源文件被包含到其他文件中时,它们将不再存在。
命名空间作用域:C++引入了命名空间以避免名称冲突。命名空间作用域是一种特殊的范围,它限制了命名空间中变量的可见性。通过使用命名空间,可以防止其他代码中的名称与您的代码中的名称冲突。全局作用域:全局作用域是在整个程序中可见的变量和函数。它们可以在程序的任何地方访问,只要它们在程序开始之前声明。
不同的作用域中可以有同名的变量/函数等
这也是为什么命名空间中可以有与局部域和全局域同名的变量
因为它们不在同一个作用域中
每一个命名空间都是一个独立的域
即两个名字不同的命名空间中的域是不同的
并不是所有命名空间都用同一个域
作用域符::
::左边(左操作数)是类名或者命名空间名,右边(右操作数)是对应的左边(左操作数)的成员
表示类/命名空间作用域中的~(成员)
编译器找一个变量/函数等的定义,寻找域的顺序
再没有用作用域指定该变量是哪一个作用域时
- 先在
局部域中寻找是否有变量/函数的定义 - 在局部域中找不到定义,再去
全局域和展开 的命名空间中寻找【不分相后】
再使用作用域指定该变量是哪一个作用域时
直接去该作用域去寻找该变量的定义
为什么要有命名空间?
为什么要有命名空间呢?
1.解决库与程序员定义的同名的重定义问题
我们可以先看以下的C语言代码:

可以看到VS报出了malloc重定义的错误
这是为什么呢?
明明我在程序中没有定义过malloc啊
其实是有定义malloc的,只不过不是程序员自己定义的,而是头文件stdlib.h中定义了动态内存申请函数malloc
包含头文件其实就是包含了头文件中的所有代码【再编译时会展开头文件】
上述问题如果是在C语言中是没有办法解决的,只能不用malloc这个名字定义变量/函数
但再C++中就可以用命名空间来解决,如下:

定义一个命名空间,把自己定义的malloc放进去,再用命名空间的名字+::(作用域符)+malloc就可以访问到命名空间中定义的mallo了
2.解决程序员与程序员之间可能定义同名变量/函数等的问题
这一条主要是在大型程序中,需要多名程序员写不同区块的代码,再合并成一个大程序时,不同的程序员的代码中,有同名的变量合并时就会产生与上一条问题类似的重定义问题
此时每一个程序员都把自己代码中的定义放在一个自己定义的命名空间中就不会产生重定义问题了
命名空间中定义的东西的生命周期
命名空间中定义的东西的生命周期与全局中定义的东西的生命周期一样
如果命名空间的名字重名
那么重名的命名空间会合并,相当于还是一个命名空间
例


同一工程中不同的文件中定义的同名的命名空间也会合并
展开命名空间
语法:using +namespace +命名空间的名字
例

1.展开命名空间并不是把命名空间拷贝过来了,命名空间的域与局部域和全局域还是不同的域
只是编译器可以默认去展开的命名空间的域中查找一个变量/函数等是否定义了
【即上面提到的编译器找一个变量/函数等的定义,寻找域的顺序】
此时展开的命名空间中的成员的访问时可以不用在其前面加命名空间名+::了
例

2.如果展开了多个命名空间,此时如果多个使用的命名空间中定义的东西同名或者与全局域中定义的东西同名,就还是会有类似重定义的问题
例


所以不能为了方便随便展开命名空间
展开命名空间中的某一成员
语法:using+命名空间名+::+命名空间的成员
例

命名空间重命名(取别名)
语法:namespace +别名=原命名空间名
例

相关文章:
命名空间【C++】(超详细)
文章目录 命名空间的概念命名空间的定义命名空间定义的位置作用域每一个命名空间都是一个独立的域作用域符:: 编译器找一个变量/函数等的定义,寻找域的顺序为什么要有命名空间?1.解决库与程序员定义的同名的重定义问题2.解决程序员…...
OceanBase OBCA 数据库认证专员考证视频
培训概述 OceanBase 认证是 OceanBase 官方推出的唯一人才能力认证体系,代表了阿里巴巴及蚂蚁集团官方对考生关于 OceanBase 技术能力的认可,旨在帮助考生更好地学习 OceanBase 数据库产品,早日融入 OceanBase 技术生态体系,通过由…...
卷积神经网络(CNN)——基础知识整理
文章目录 1、卷积神经网络 2、图片格式 3、图片卷积运算 4、Kernel 与 Feature Map 5、padding/边缘填充 6、Stride/步长 7、pooling/池化 8、shape 9、epoch、batch、Batch Size、step 10、神经网络 11、激活函数 1、卷积神经网络 既然叫卷积神经网络,这里面首先是…...
2024四川省赛“信息安全管理与评估“--网络事件响应--应急响应(高职组)
2024四川省赛“信息安全管理与评估“(高职组)任务书 2024四川省赛“信息安全管理与评估“任务书第一阶段竞赛项目试题第二阶段竞赛项目试题任务 1 应急响应(40分)第三阶段竞赛项目试题2024四川省赛“信息安全管理与评估“任务书 第一阶段竞赛项目试题 先略 第二阶段竞赛…...
Java类与对象:从概念到实践的全景解析!
个人主页:秋风起,再归来~ 文章专栏:javaSE的修炼之路 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 1、类的定义格式 在java中定义类时需要用到…...
MySQL与SQLite区别
MySQL和SQLite都是关系型数据库管理系统(RDBMS),它们都使用SQL(结构化查询语言)作为标准查询语言。然而,尽管它们共享许多共同点,但它们在语法、功能、性能和存储机制方面存在一些差异。 以下是…...
【社会救助管理系统】主要设计及拟采用的技术方案
主要设计及拟采用的技术方案 1. 主要设计(1)系统架构设计(2)功能设计(3)安全性设计 2. 设计思想(1)系统架构设计思想(2)功能设计思想(3࿰…...
视频素材库哪个软件好?这8个高清无版权的素材网推荐
小伙伴们在制作短视频的时候,是不是为找素材发愁呢?一个高质量的无水印视频对创作者的帮助太大了,而且还需要无版权可商用的,那究竟有没有这样的网站呢?今天我来告诉大家。 1,蛙学府(中国&…...
GEE23:基于植被物候实现农作物分类
地物分类 1. 写在前面2. 北京作物分类 1. 写在前面 今天分享一个有意思的文章,用于进行农作物分类。文章提出了一个灵活的物候辅助监督水稻(PSPR)制图框架。主要是通过提取植被物候,并自动对物候数据进行采样,获得足够多的样本点,…...
一些常见的Docker问题和答案
什么是Docker?它的主要功能是什么? Docker是一种开源的容器化平台,用于构建、部署和运行应用程序。它的主要功能包括:快速构建、分发和运行应用程序的容器化环境,实现应用程序的可移植性和可扩展性。 Docker和虚拟机…...
Web CSS笔记2
目录 1、背景 ①、背景图片(image) ②、背景平铺(repeat) ③、背景位置(position) ④、背景附着(attachment) ⑤、背景透明(CSS3) ⑥、背景图片缩放大小(size): ⑦、背景简写 2、标签显…...
SpringBoot -- 整合SpringMVC
SpringBoot已经替我们整合了许多框架并进行了默认的配置,我们只需要在依赖中导入spring-boot-starter-web,就可以直接使用SpringMVC以及web场景下的已经整合好的功能。但SpringBoot的默认配置可能无法满足我们所有的需求,那么我们怎么进行自定…...
C语言操作符详细讲解
前言 本次博客一定会让刚刚学习C语言小白有所收获 本次操作符讲解不仅分类还会有代码示例 好好看 好好学 花上几分钟就可以避免许多坑 1 操作符的基本使用 1.1操作符的分类 按功能分 算术操作符: 、- 、* 、/ 、% 移位操作符: >> << 位操作符…...
Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!
文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场,国际化是肯定…...
服务器大请求体问题定位
背景 整个系统,分位微服务A、微服务B,A在调用B的过程中,报400BadRequest,问题定位到修复后,如何发送一个同样的请求进行验证 解决过程 1、查询A服务的日志,发现在调用B的过程中报错400BadRequest,并且请求体非常大300多KB 2、查看B服务的日志,发现请求没有进来 3、发…...
Vue指令之v-model
调了半天没反应,结果是没引用Vue,我是伞兵。 v-model的作用是将视图与数据双向绑定。一般情况下,Vue是数据驱动的,即数据发生改变后网页就会刷新一次,更改对应的网页内容,即数据单向绑定了网页内容。而使用…...
信息系统项目管理师——第11章项目成本管理(重要)
选择、本章节内容属于10大管理知识领域中的重中之重案例、论文都会考,需要完全掌握。 选择题大概考3分左右,理论和计算都会考。 案例题,必考内容,挣值相关的计算,必须得会。 论文题,考的比较多,…...
SpringMVC常见面试题
1:Spring mvc执行流程 回答: 版本1:视图版本,jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器,生成处理器对象及处理器拦…...
golang 和java对比
Golang(又称Go)和Java都是目前非常流行的编程语言,但它们有着不同的设计哲学和用途。在本文中,我们将对Golang和Java进行比较,从以下几个方面进行评估:语言特性、性能、并发性能、生态系统和使用场景。 一…...
基于pear-admin-flask 的 flask 使用教程
我最近接触到了一个极为出色的Flask后台库——pear-admin-flask,这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
高防服务器价格高原因分析
高防服务器的价格较高,主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因: 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器,因此…...
生信服务器 | 做生信为什么推荐使用Linux服务器?
原文链接:生信服务器 | 做生信为什么推荐使用Linux服务器? 一、 做生信为什么推荐使用服务器? 大家好,我是小杜。在做生信分析的同学,或是将接触学习生信分析的同学,<font style"color:rgb(53, 1…...
Python 解释器安装全攻略(适用于 Linux / Windows / macOS)
目录 一、Windows安装Python解释器1.1 下载并安装Python解释1.2 测试安装是否成功1.3 设置pip的国内镜像------永久配置 二、macOS安装Python解释器三、Linux下安装Python解释器3.1 Rocky8.10/Rocky9.5安装Python解释器3.2 Ubuntu2204/Ubuntu2404安装Python解释器3.3 设置pip的…...
