【C++】1. 命名空间

news2024/10/4 15:30:53

文章目录

  • 一、命名空间的由来
  • 二、命名空间的使用
    • 2.1 关键字:namespace
    • 2.2 访问命名空间里的标识符
    • 2.3 命名空间的特点
  • 三、总结


一、命名空间的由来

当我们使用c语言编写项目时,可能遇到以下情况:

  1. 变量名与某个库函数名重复,导致保错。这种情况一般是自己不知道引用的头文件包含哪些库函数。

在这里插入图片描述
2. 和队友一起编写项目时,自己使用的标识符和队友的标识符名字一样,导致代码整合时发生错误。这种情况很难避免,毕竟一些常用的命名习惯是大家都有的,那这个时候怎么办呢?总不能打一架来争夺命名权。
在这里插入图片描述
基于这样的问题,c++的创造者创造了命名空间。

当多个库或代码文件被组合在一起时,可能会出现相同名称的变量、函数、类等,这种情况称为“命名冲突”。命名空间可以在不改变原有代码的情况下,将标识符放在特定的作用域中,以避免命名冲突。


二、命名空间的使用

上面提到,命名空间通过将标识符放在特定的作用域来解决命名冲突。这里出现一个名词:作用域。学过c语言的人应该都知道这个概念。

作用域是指在程序代码中,标识符有效的区域或范围。在作用域内,标识符可以被使用或修改,而在其它作用域内则可能无法访问该标识符。

变量只有在它的作用域里才能发挥它的作用。局部变量只能在局部域发挥作用,全局变量只有在全局域才能发挥作用。
由于作用域的存在,请问以下代码会发生命名冲突吗?
在这里插入图片描述
不会!因为两个a不在同一个域中。
编译器在使用a这个标识符时,一般按照以下顺序去寻找a:局部域->全局域。


因此我们按照这样的思路,来创建一个命名空间域存放我们设置的标识符。

2.1 关键字:namespace

namespace的使用如下:
在这里插入图片描述
此时sfw里的a就不会与sfw域外面的a产生冲突。
命名空间内部可以包含结构体,函数……


2.2 访问命名空间里的标识符

上面提到编译器查找标识符的顺序是 :局部域->全局域。
现在我们创建了sfw这个命名空间,那编译器此时访问顺序会变成什么?不变,因为编译器不会主动去访问命名空间里的内容。
在这里插入图片描述
那我们怎么访问命名空间里的标识符呢?有三种方法。

  1. 展开命名空间:通过使用using这个关键字,如下图
    在这里插入图片描述
    注意:展开命名空间相当于把这个命名空间暴露在全局域当中。
    这就意味着:如果此时全局域有一个标识符和sfw命名空间里一个标识符相同,则会发生命名冲突。如下图,因此不推荐这种玩法。
    在这里插入图片描述
    补:using namespace sfw;需要在sfw这个命名空间创建后才能使用,如果这句代码在namespace sfw {……}上面,则会报错

  1. 使用作用域限定符::来访问命名空间里的标识符 : 命名空间名字+::+标识符,如下图
    在这里插入图片描述
    这种方式就不用担心展开命名空间造成的错误了,因此这种方式往往是大型团队项目的使用方式

  1. 展开命名空间的某一部分:using + namespace + 命名空间的名字 + :: + 标识符
    在这里插入图片描述
    这种方式仍有展开命名空间相同的错误,比如此时刚好有个全局变量是a,一样也会报错。个人还是推荐第二种方式。

2.3 命名空间的特点

我们已经知道了如何创建和访问命名空间,下面我们来学习命名空间的一些特点。

  1. 命名空间的嵌套:一个命名空间可以包含另一个一个命名空间
    在这里插入图片描述

  2. 命名空间的合并
    请问:命名空间会发生命名冲突吗?即我创建了一个命名空间:sfw,你也创建了一个命名空间:sfw。
    答:冲了但也没冲。编译器会将相同名字的命名空间合在一起,如果这两个命名空间都定义了相同的标识符,则发生冲突。
    在这里插入图片描述


三、总结

命名空间是C++中用来避免命名冲突的一种机制。创建和使用命名空间的方法如下:

创建命名空间:在全局或其他命名空间的作用域内,使用关键字namespace加上命名空间的名称来创建一个命名空间,例如:

namespace my_namespace {
   // 命名空间的定义内容
}

命名空间中可以定义变量、函数、类等标识符,并给他们都加上该命名空间的前缀。例如:

namespace my_namespace {
    int my_var = 0;  // 定义命名空间内的变量
    void my_function() {  // 定义命名空间内的函数
        // 函数代码
    }
    class MyClass {  // 定义命名空间内的类
        // 类定义
    };
}

使用命名空间:在使用命名空间内的标识符时,需要在其前面加上命名空间的名称和作用域限定符(::),例如:

my_namespace::my_var = 100;   // 使用 my_namespace 命名空间内的变量
my_namespace::my_function();  // 调用 my_namespace 命名空间内的函数
my_namespace::MyClass obj;    // 使用 my_namespace 命名空间内的类

可以使用using关键字引入命名空间中的标识符,使得在该作用域内可以直接使用该标识符而不需要加上命名空间前缀。例如:

using my_namespace::my_var;
my_var = 100;   // 直接使用 my_var,无需加上命名空间前缀

命名空间的使用可以避免不同模块或工程中使用同名标识符导致的冲突问题,同时也便于代码维护和阅读。

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

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

相关文章

sscanf和snprintf格式化时间字符串的日期与时间戳相互转换用法

sscanf格式化时间字符串的用法 UTC:Coordinated Universal Time 协调世界时。因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年协调世界时组织都会给世界时1秒,让基于原子钟的世界时和基于天文学(人类感知…

测试技术与信号处理实验报告

目录 金属箔式应变片——单臂电桥性能实验 金属箔式应变片——半桥性能实验 金属箔式应变片——全桥性能实验 差动变压器的性能实验 直流全桥的应用——电子秤实验 交流激励时霍尔式传感器的位移特性实验 电容式传感器的位移实验 磁电式转速传感器测速实验 金属箔式应变…

C++ -- 继承

文章目录1. 继承的概念和定义1.1 概念1.2 定义1.2.1 定义格式1.2.2 继承基类成员访问方式的变化2. 基类和派生类对象赋值转换3. 继承中的作用域4. 派生类的默认成员函数5. 继承与友元6. 继承与静态成员7. 复杂的菱形继承及菱形虚拟继承8. 继承和组合1. 继承的概念和定义 1.1 概…

听歌无线耳机哪个品牌好?2023适合听歌的好音质蓝牙耳机推荐

现如今,不管是听歌、追剧或是玩游戏,不少人喜欢戴蓝牙耳机进行。因为蓝牙耳机的功能更丰富,连接方便,还摆脱了线的束缚,使用起来更方便。那么,听歌无线耳机哪个品牌好?针对这个问题,…

『造轮子』亿级短URL生成器的架构设计及源码分享

📣读完这篇文章里你能收获到 了解博主的短链生成的架构设计思路学习不同的短链技术方案选择学习基于混淆的自增短URL算法了解博主造的轮子SuperShortLink短链开源项目感谢点赞收藏,避免下次找不到~ 文章目录一、需求分析1. 短链生成及访问需求2. 短链应…

Python+requests+unittest+excel接口自动化测试框架

一、框架结构: 工程目录 二、Case文件设计 三、基础包 base 3.1 封装get/post请求(runmethon.py) 1 import requests2 import json3 class RunMethod:4 def post_main(self,url,data,headerNone):5 res None6 if heade…

互联网医院源码|搭建互联网医院系统时运营需要哪些资质?

目前一线城市已经都有完善的医疗系统,人们对于线上问诊系统越来越熟悉,使用的人也越来越多,对于一些偏远的地区来说在线问诊平台有着更广泛的应用和意义,互联网医院开发实现了医疗资源共享的情况,打破了地域限制&#…

文献管理软件Endnote、Mendeley、Zotero比较及选择,Zotero基础使用技巧

引言 大家好,我是比特桃。日常开发的项目分为两种,一种是成熟化的工程项目,只需要与具体的业务紧密结合及应用,难点也比较偏向于软件工程或者互联网高并发的方向。这种项目我们通常不会选择去查文献去寻找问题的解决办法&#xf…

微信小程序开发 | 音乐小程序项目

音乐小程序项目3.1 开发前的准备3.1.1 项目展示3.1.2 项目分析3.1.3 项目初始化3.2 【任务1】标签页切换3.2.1 任务分析3.2.2 前导知识3.2.3 编写页面结构和样式3.2.4 实现标签页切换3.3 【任务2】音乐推荐3.3.1 任务分析3.3.2 前导知识3.3.3 内容区域滚动3.3.4 轮播图3.3.5 功…

15-721 chapter2 内存数据库

Background 随着时代的发展,DRAM可以容纳足够的便宜,容量也变大了。对于数据库来说,数据完全可以fit in memory,但同时面向disk的数据库架构不能很好的发挥这个特性 这张图是disk database的cpu instruction cost 想buffer pool…

使用PyG(PyTorch Geometric)实现基于图卷积神经网络(GCN)的节点分类任务

文章目录基本介绍PyTorch Geometric图卷积神经网络GCN节点分类任务实现Cora数据集搭建GCN模型训练与测试迭代并输出完整代码基本介绍 PyTorch Geometric PyG(PyTorch Geometric)是一个基于PyTorch的库,可以轻松编写和训练图神经网络&#x…

ChatGPT,开启人机交互新篇章

ChatGPT在世界掀起了生成式AI的热潮,2个月实现月活用户过亿,是人类有史以来突破1亿人用户最快的消费端互联网产品,打破了Tiktok9个月破亿用户的纪录。不少专家将其视为第四次工业革命,资本市场也贡献大量涨停。当第一波的热情消退…

Android 7.1 Toast修复之终极篇,进程不奔溃(包含apk和兼容外来dex插件)

修复android 7.1 Toast的篇章: 常规app通过ams lancet 字节编码处理:Android Lancet Aop 字节编码修复7.1系统Toast问题(WindowManager$BadTokenException)多渠道游戏app兼容性处理:Android 7.1 Toast修复之多渠道包动态使用Booster或者Lancet plugin …

在外web浏览器远程访问jupyter notebook服务器【内网穿透】

文章目录前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口转载自远控源码文章:公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook,它是一个交…

未来城市的微小单元:滴滴即将量产无人车

汽车诞生之后就一直作为除了家庭与公司之外的「第三空间」存在,技术的脚步从未停止过开发汽车的更多可能。尤其无人驾驶技术的出现,进一步解放了驾驶者,也让人们对于这一能够自主移动的第三空间充满了想象。作为未来城市的微小组成单元&#…

( “树” 之 DFS) 226. 翻转二叉树 ——【Leetcode每日一题】

226. 翻转二叉树 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 2: 输入:root [2,1,3] 输出:[…

ThreadLocal源码分析及内存泄漏

ThreadLocal原理分析及内存泄漏ThreadLocal的使用ThreadLocal原理set方法解析replaceStaleEntry方法解析expungeStaleEntry方法解析cleanSomeSlots方法解析case 1: 向前有脏数据,向后找到可覆盖的Entrycase 2: 向前有脏数据,向后未找到可覆盖的Entrycase…

吴恩达机器学习--线性回归

文章目录前言一、单变量线性回归1.导入必要的库2.读取数据3.绘制散点图4.划分数据5.定义模型函数6.定义损失函数7.求权重向量w7.1 梯度下降函数7.2 最小二乘法8.训练模型9.绘制预测曲线10.试试正则化11.绘制预测曲线12.试试sklearn库二、多变量线性回归1.导入库2.读取数据3.划分…

掌握高效绘制地图的利器——LeafletJs

文章目录前言一、leafletJs是什么?二、快速入门1、安装2、快速入门三、进阶学习1、Map 控件2、Marker 标记3、Popup 弹出窗口4、图层四、项目实战封装文件4.1 基础点位图4.2 行驶轨迹图前言 GIS 作为获取、存储、分析和管理地理空间数据的重要工具,用 G…

数据结构与算法一览(树、图、排序算法、搜索算法等)- Review

算法基础简介 - OI Wiki (oi-wiki.org) 文章目录1. 数据结构介绍1.1 什么是数据结构1.2 数据结构分类2. 链表、栈、队列:略3. 哈希表:略4. 树4.1 二叉树4.2 B 树与 B 树4.3 哈夫曼(霍夫曼)树:Huffman Tree4.4 线段树&a…