当前位置: 首页 > news >正文

命名空间【C++】(超详细)

文章目录

  • 命名空间的概念
  • 命名空间的定义
  • 命名空间定义的位置
  • 作用域
    • 每一个命名空间都是一个独立的域
    • 作用域符::
  • 编译器找一个变量/函数等的定义,寻找域的顺序
  • 为什么要有命名空间?
    • 1.解决库与程序员定义的同名的重定义问题
    • 2.解决程序员与程序员之间可能定义同名变量/函数等的问题
  • 命名空间中定义的东西的生命周期
  • 如果命名空间的名字重名
  • 展开命名空间
    • 展开命名空间中的某一成员
  • 命名空间重命名(取别名)

命名空间的概念

命名空间是用来组织和重用代码的
如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象
对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有重定义的问题
为了解决这个问题,引入了命名空间这个概念,通过使用
namespace xxx:你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。


命名空间的定义

语法:命名空间关键字(namespace)+命名空间的名字+{ 定义的东西 }

例:

namespace My
{int malloc = 10;int b = 0;void dfs();
}

命名空间中可以定义很多类型的东西
如 变量,函数,结构体,类,其他的命名空间等等

只要可以定义的东西都可以放到命名空间中定义


命名空间定义的位置

命名空间只能全局或者另一个命名空间中定义


作用域

C++中的作用域主要有以下4种:

  1. 局部作用域:这是最常见的类型,它表示在特定函数或代码块(如if语句、for循环、while循环、switch语句等被{}包括的)内的变量。
    局部变量在它们被声明的代码块或函数内有效,当代码块或函数结束时,它们就会被销毁。

  2. 文件作用域:在C++中,一个源文件可以包含多个源代码文件。这些源代码文件中的变量和函数通常具有文件作用域。这意味着它们只在包含它们的文件中有效,当源文件被包含到其他文件中时,它们将不再存在。

  3. 命名空间作用域:C++引入了命名空间以避免名称冲突。命名空间作用域是一种特殊的范围,它限制了命名空间中变量的可见性。通过使用命名空间,可以防止其他代码中的名称与您的代码中的名称冲突。

  4. 全局作用域:全局作用域是在整个程序中可见的变量和函数。它们可以在程序的任何地方访问,只要它们在程序开始之前声明。

不同的作用域中可以有同名的变量/函数等
这也是为什么命名空间中可以有与局部域和全局域同名的变量
因为它们不在同一个作用域中


每一个命名空间都是一个独立的域

即两个名字不同的命名空间中的域是不同的
并不是所有命名空间都用同一个域


作用域符::

::左边(左操作数)是类名或者命名空间名,右边(右操作数)是对应的左边(左操作数)的成员

表示类/命名空间作用域中的~(成员)


编译器找一个变量/函数等的定义,寻找域的顺序

没有用作用域指定该变量是哪一个作用域时

  1. 先在局部域中寻找是否有变量/函数的定义
  2. 在局部域中找不到定义,再去全局域展开 的命名空间中寻找【不分相后

使用作用域指定该变量是哪一个作用域时

直接去该作用域去寻找该变量的定义


为什么要有命名空间?

为什么要有命名空间呢?

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&#xff0…...

视频素材库哪个软件好?这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操作符的分类 按功能分 算术操作符&#xff1a; 、- 、* 、/ 、% 移位操作符: >> << 位操作符…...

Godot 学习笔记(5):国际化多语言翻译,包含常用10种语言机翻!

文章目录 前言国际化翻译Api选择小牛测试 语言选择代码逻辑实体对象翻译帮助类导出模板读取文件翻译测试多语言测试 综合翻译文件准备测试代码测试结果 完整代码实体类翻译帮助类网络帮助类 最终效果翻译前翻译中翻译后 总结 前言 为了面向更大的市场&#xff0c;国际化是肯定…...

服务器大请求体问题定位

背景 整个系统,分位微服务A、微服务B,A在调用B的过程中,报400BadRequest,问题定位到修复后,如何发送一个同样的请求进行验证 解决过程 1、查询A服务的日志,发现在调用B的过程中报错400BadRequest,并且请求体非常大300多KB 2、查看B服务的日志,发现请求没有进来 3、发…...

Vue指令之v-model

调了半天没反应&#xff0c;结果是没引用Vue&#xff0c;我是伞兵。 v-model的作用是将视图与数据双向绑定。一般情况下&#xff0c;Vue是数据驱动的&#xff0c;即数据发生改变后网页就会刷新一次&#xff0c;更改对应的网页内容&#xff0c;即数据单向绑定了网页内容。而使用…...

信息系统项目管理师——第11章项目成本管理(重要)

选择、本章节内容属于10大管理知识领域中的重中之重案例、论文都会考&#xff0c;需要完全掌握。 选择题大概考3分左右&#xff0c;理论和计算都会考。 案例题&#xff0c;必考内容&#xff0c;挣值相关的计算&#xff0c;必须得会。 论文题&#xff0c;考的比较多&#xff0c;…...

SpringMVC常见面试题

1&#xff1a;Spring mvc执行流程 回答&#xff1a; 版本1&#xff1a;视图版本&#xff0c;jsp 用户发送出请求到前端控制器DispatcherServletDispatcherServlet收到请求调用HandlerMapping(处理映射器)HandlerMapping找到具体的处理器&#xff0c;生成处理器对象及处理器拦…...

golang 和java对比

Golang&#xff08;又称Go&#xff09;和Java都是目前非常流行的编程语言&#xff0c;但它们有着不同的设计哲学和用途。在本文中&#xff0c;我们将对Golang和Java进行比较&#xff0c;从以下几个方面进行评估&#xff1a;语言特性、性能、并发性能、生态系统和使用场景。 一…...

基于pear-admin-flask 的 flask 使用教程

我最近接触到了一个极为出色的Flask后台库——pear-admin-flask&#xff0c;这个库具有很高的二次开发价值。借此机会学习并吸收其中Flask开发的一些高级技巧。 1. flask 自定义命令 pear-admin-flask/applications/common/script/admin.py from flask.cli import AppGroup …...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

深入剖析AI大模型:大模型时代的 Prompt 工程全解析

今天聊的内容&#xff0c;我认为是AI开发里面非常重要的内容。它在AI开发里无处不在&#xff0c;当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗"&#xff0c;或者让翻译模型 "将这段合同翻译成商务日语" 时&#xff0c;输入的这句话就是 Prompt。…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)

笔记整理&#xff1a;刘治强&#xff0c;浙江大学硕士生&#xff0c;研究方向为知识图谱表示学习&#xff0c;大语言模型 论文链接&#xff1a;http://arxiv.org/abs/2407.16127 发表会议&#xff1a;ISWC 2024 1. 动机 传统的知识图谱补全&#xff08;KGC&#xff09;模型通过…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

QT: `long long` 类型转换为 `QString` 2025.6.5

在 Qt 中&#xff0c;将 long long 类型转换为 QString 可以通过以下两种常用方法实现&#xff1a; 方法 1&#xff1a;使用 QString::number() 直接调用 QString 的静态方法 number()&#xff0c;将数值转换为字符串&#xff1a; long long value 1234567890123456789LL; …...

ios苹果系统,js 滑动屏幕、锚定无效

现象&#xff1a;window.addEventListener监听touch无效&#xff0c;划不动屏幕&#xff0c;但是代码逻辑都有执行到。 scrollIntoView也无效。 原因&#xff1a;这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作&#xff0c;从而会影响…...