命名空间【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.rhkb.cn/news/291806.html

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

相关文章

变分信息瓶颈

变分信息瓶颈和互信息的定义 1 变分信息瓶颈 定义:变分信息瓶颈(Variational Information Bottleneck)是一种用于学习数据表示的方法,它旨在通过最小化输入和表示之间的互信息来实现数据的压缩和表示学习。这种方法通常用于无监…

pnpm、monorepo分包管理、多包管理、npm、vite、前端工程化、保姆级教程

浅尝pnpm monorepo 多包管理方案 💡tips: 创建pnpm monorope多包管理框架流程 初始化 mkdir taurus & cd taurus pnpm init创建基础文件 创建文件pnpm-workspace.yaml packages:- packages/**创建文件夹packages/ -packages/ -package.json -pnpm-workspace…

Java类与对象:从概念到实践的全景解析!

​ 个人主页:秋风起,再归来~ 文章专栏:javaSE的修炼之路 个人格言:悟已往之不谏,知来者犹可追 克心守己,律己则安! 1、类的定义格式 在java中定义类时需要用到…

DSVPN实验报告

一、分析要求 1. 配置R5为ISP,只能进行IP地址配置,所有地址均配为公有IP地址。 - 在R5上,将接口配置为公有IP地址,并确保只进行了IP地址配置。 2. R1和R5之间使用PPP的PAP认证,R5为主认证方;R2于R5之间…

【MySQL】DQL-基础查询-语句&演示(查询多个字段 / 所有字段/并设置别名/去重)

前言 大家好吖,欢迎来到 YY 滴MySQL系列 ,热烈欢迎! 本章主要内容面向接触过C Linux的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

一分钟了解三极管到底放大了什么?

目录 三极管放大原理 三极管的工作状态 截止区 放大区 饱和区 三极管的放大作用 电流放大 电压放大 功率放大 在电子学中,三极管通常用于实现信号放大、开关控制等多种功能,三极管主要功能是放大电流信号。下面,将详细解释三极管放大的原理和…

海格里斯助推实体制造业转型升级 “算法定义硬件”解题AIoT市场

随着自动化的发展,电子商务和智能制造推动了自动化立体仓库的快速发展与创新,产生了“密集仓储”的概念。对于一个实体企业来讲,其数智物流转型正在趋向于“去伪存真”,企业追求高ROI与真实经济价值,具有降本增效的业务…

java(1)之环境部署

1、下载安装包 直接百度java 点击这个就可以,进去之后下载,根据自身情况,window就下Windows版本的记得下那个jdk别下别的(用不了),然后下一个编译器可以是idea可以是eclipse都可以 2、环境搭建 分为两步…

使用pdf表单域填充pdf内容

需要引用如下包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.3</version><type>pom</type></dependency>1、预先准备一个pdf模板&#xff0c;并在指定位置添加…

IDEA的Scala环境搭建

目录 前言 Scala的概述 Scala环境的搭建 一、配置Windows的JAVA环境 二、配置Windows的Scala环境 编写一个Scala程序 前言 学习Scala最好先掌握Java基础及高级部分知识&#xff0c;文章正文中会提到Scala与Java的联系&#xff0c;简单来讲Scala好比是Java的加强版&#x…

云原生(六)、CICD - Jenkins快速入门

Jenkuns快速入门 一、CICD概述 CICD是持续集成&#xff08;Continuous Integration&#xff09;和持续部署&#xff08;Continuous Deployment&#xff09;的缩写。它是软件开发中的一种流程和方法论&#xff0c;旨在通过自动化的方式频繁地将代码集成到共享存储库中&#xf…

Jira 软件缺陷管理 (软件测试)

内容来源&#xff1a;总结黑马课程 1.软件缺陷信息 2.创建缺陷问题 2.1 缺陷模板 2.2 创建缺陷问题模板

vite+vue3使用模块化批量发布Mockjs接口

在Vue3项目中使用Mock.js可以模拟后端接口数据&#xff0c;方便前端开发和调试。下面是使用vitevue3使用模块化批量发布Mockjs接口的步骤&#xff1a; 1. 安装Mock.js 在Vue3项目的根目录下&#xff0c;使用以下命令安装Mock.js&#xff1a; npm install mockjs --save-dev …

flutter Got socket error trying to find package nested at

flutter Got socket error trying to find package nested at xxx 报错信息&#xff1a;“Got socket error trying to find package nested at” 通常出现在Flutter尝试从pub.dev获取依赖包时&#xff0c;由于网络问题导致无法连接到pub.dev或者无法正确解析包的路径。 例如&…

element-ui inputNumber 组件源码分享

今日简单分享 inputNumber 组件的实现原理&#xff0c;主要从以下四个方面来分享&#xff1a; 1、inputNumber 组件的页面结构 2、inputNumber 组件的属性 3、inputNumber 组件的事件 4、inputNumber 组件的方法 一、inputNumber 组件的页面结构。 二、inputNumber 组件的…

HarmonyOS实战开发-使用List组件实现导航与内容联动的效果。

1 卡片介绍 使用ArkTS语言&#xff0c;实现一个导航与内容二级联动的效果。 2 标题 二级联动&#xff08;ArkTS&#xff09; 3 介绍 本篇Codelab是主要介绍了如何基于List组件实现一个导航和内容的二级联动效果。样例主要包含以下功能&#xff1a; 切换左侧导航&#xff…

【ROS 笔记1】Topic message通俗理解

前言: topic 能够将所有的独立的模块, 进行有序的交流,链接。 可以想象, roscore, 假设是一个铁路系统的总的开关,当打开总的开关(run roscore), 铁路路就可以畅通起来, 铁路畅通后, 如何进行北京站(机器人recognition)与上海站(机器人抓取)的交流。 那么我们可以从…

iOS UIFont-实现三方字体的下载和使用

UIFont 系列传送门 第一弹加载本地字体:iOS UIFont-新增第三方字体 第二弹加载线上字体:iOS UIFont-实现三方字体的下载和使用 前言 在上一章我们完成啦如何加载使用本地的字体。如果我们有很多的字体可供用户选择,我们当然可以全部使用本地字体加载方式,可是这样就增加了…

新能源汽车充电桩常见类型及充电桩站场的智能监管方案

随着新能源汽车市场的迅猛发展&#xff0c;充电桩作为支持其运行的基础设施&#xff0c;也呈现出多样化的类型。这些充电桩不仅在外形和功能上存在差异&#xff0c;更在充电速度、充电方式以及使用场景等方面展现出独特的优势。 一、充电桩类型及区别 1、慢充桩&#xff08;交…

【力扣】300. 最长递增子序列(DFS+DP两种方法实现)

目录 题目传送最长递增子序列[DFS 方法]DFS方法思路图思路简述代码大家可以自行考虑有没有优化的方法 最长递增子序列[DP]方法DP方法思路图思路简述代码方案 题目传送 原题目链接 最长递增子序列[DFS 方法] DFS方法思路图 思路简述 对于序列中的每一个数字只有选择和不选择两…