命名空间【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 +别名=原命名空间名


在这里插入图片描述


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

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

相关文章

【氮化镓】p-GaN栅极退化的温度和结构相关性

论文总结: 本文献深入研究了带有p-GaN栅极的正常关断型(normally-off)高电子迁移率晶体管(GaN-HEMTs)在恒定电压应力下的时序退化行为。通过直流特性分析和温度依赖性分析,研究了故障时间(TTF)与应力温度和器件几何结构的依赖性。结果显示,p…

JavaWeb作业四

一. 单选题(共5题,30分) 1. (单选题, 6分) 以下关于Spring核心容器相关说法错误的是。 A Spring框架的所有功能都是通过其核心容器来实现的。 B 创建BeanFactory实例时,需要提供Spring所管理容器的详细配置信息,这…

FME学习之旅---day17

我们付出一些成本,时间的或者其他,最终总能收获一些什么。 【FME-HOW-TO系列】28 栅格邻域函数 RasterConvolver转换器说明: 接受包含栅格几何对象的输入要素,并在对所有波段应用卷积滤波 器后输出要素。 本人对栅格数据处理的较…

mysql笔记:25. docker环境中mysql主从复制、主主复制实操

文章目录 一、准备工作1. 安装配置Docker2. 准备MySQL相关的配置和数据目录 二、基于日志点的主从复制1. 配置Master服务器1.1 修改配置文件1.2. 在docker中启动Master节点1.3. 创建用户并授权 2. 配置Slave1服务器2.1. 修改配置2.2. 启动服务2.3. 指定Master2.4. 开始复制 3. …

vue computed和watch的区别【网易,京东,拼多多】

知识点 computed和watch的区别 题目 讲一下vue组件的computed和watch的区别。 答案 应用场景不同 computed用在根据data属性或者其他computed计算得到一个新值的情况,computed的值一般被用在渲染中。 watch用在监听数据变化,然后做一些有副作用的操…

【2023】kafka在linux和docker安装(kafka-1)

目录💻 一、linux安装kafka1. 安装jdk2. 上传解压到/usr/local目录下3、使用kafka 二、docker安装kafka1. 下载2. 安装zookeeper3. 安装kafka 一、linux安装kafka 环境主机 mac m2、虚拟机Ubuntu22.04.4 1. 安装jdk yum install -y java-1.8.0-openjdk.x86_64下载k…

11-设计模式:Go常用设计模式概述

设计模式是啥呢?简单来说,就是将软件开发中需要重复性解决的编码场景,按最佳实践的方式抽象成一个模型,模型描述的解决方法就是设计模式。使用设计模式,可以使代码更易于理解,保证代码的重用性和可靠性。 …

【Entity Framework】EF中DbSet类详解

【Entity Framework】EF中DbSet类详解 文章目录 【Entity Framework】EF中DbSet类详解一、概述二、定义DbSet2.1 具有DbSet属性的DbContext2.2 具有 IDbSet 属性的 DbContext 2.3 具有 IDbSet 属性的 DbContext三、DbSet属性四、DbSet方法五、DbContext动态生成DbSet 一、概述 …

打工人神器! Raccoon 代码小浣熊

继这三个之后,今天又来了一个 [ Raccoon代码小浣熊 ] 核心精要与产品特点 全面支持多种编程语言和IDE:「代码小浣熊」支持超过90种主流编程语言,包括但不限于Python、Java、JavaScript、C、Go和SQL等。同时,它集成了市面上主流的…

Quiet-STaR:让语言模型在“说话”前思考

大型语言模型(llm)已经变得越来越复杂,能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题,与人类不同LLM经常在推理中涉及的隐含步骤中挣扎,这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…

CTF题型 php://filter特殊编码绕过小汇总

CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议,它允许你读取经过过滤器处理的数据流…

YOLO图像前处理及格式转换

import cv2 import numpy as np import os import glob# 数据增强函数 def augment_data(img):rows,cols,_ img.shape# 水平翻转图像if np.random.random() > 0.5:img cv2.flip(img, 1)img_name os.path.splitext(save_path)[0] "_flip.png"cv2.imwrite(img_n…

【C++】string类(常用接口)

🌈个人主页:秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343🔥 系列专栏:http://t.csdnimg.cn/eCa5z 目录 修改操作 push_back append operator assign insert erase replace c_str find string类非成…

AI学习-Pandas数据处理分析

文章目录 1. Pandas概述2. Series用法2.1 Series的创建2.2 Series的取值2.3 Series的相关方法 3. DataFrame用法3.1 DataFrame创建3.2 DataFrame取值3.3 DataFrame相关方法 1. Pandas概述 ​ Pandas 是一个开源的数据分析处理库,它应用在数据科学、统计分析、机器学…

9.0-源码分析:Dubbo Remoting 层核心接口分析

dubbo-remoting 模块,该模块提供了多种客户端和服务端通信的功能。在 Dubbo 的整体架构设计图中,我们可以看到最底层红色框选中的部分即为 Remoting 层,其中包括了 Exchange、Transport和Serialize 三个子层次。这里我们要介绍的 dubbo-remot…

C++类继承继承5——构造函数与拷贝控制

构造函数与拷贝控制 和其他类一样,位于继承体系中的类也需要控制当其对象执行一系列操作时发生什么样的行为,这些操作包括创建、拷贝、移动、赋值和销毁。 如果一个类(基类或派生类)没有定义拷贝控制操作,则编译器将为它合成一个版本。当然…

手写简易操作系统(十七)--编写键盘驱动

前情提要 上一节我们实现了锁与信号量,这一节我们就可以实现键盘驱动了,访问键盘输入的数据也属于临界区资源,所以需要锁的存在。 一、键盘简介 之前的 ps/2 键盘使用的是中断驱动的,在当时,按下键盘就会触发中断&a…

乐理通识

2023 年搞了台雅马哈 61 键的电子琴,顺手看了下啊 B 的上的课程 《零基础自学音乐学乐理合集-第一季》,这里是部分笔记(给博客加点不一样的东西👀)。 简谱各部分一览 C 表示音名竖线为小节线 音名 完整钢琴键盘 88 键…

什么是ORM

什么是ORM 通过 对象 操作数据库 的方法 被称之为 ORM 数据库的表的格式定义 和 表里面一条条数据 之间的关系,很像python的 类定义 和 类的实例 之间的关系 既然 数据库 表定义和表记录之间的关系 就像 类和实例 之间的关系,Django 就让开发者 通过 …

数据结构

一、栈 先进后出 二、队列 先进先出 三、数组 查询快,增加修改慢 四、链表 查询慢,增加修改慢 五、二叉树 节点: 查找二叉树 二叉查找树的特点 二叉查找树,又称二叉排序树或者二叉搜索树 每一个节点上最多有两个子节点 左子树上所…