【C++指南】命名空间

news2024/11/24 1:02:58

       

          💓 博客主页:倔强的石头的CSDN主页 

           📝Gitee主页:倔强的石头的gitee主页

            ⏩ 文章专栏:《C++指南》

                                  期待您的关注

 

1b7335aca73b41609b7f05d1d366f476.gif

 

目录

一、命名空间的重要性

1.  C语言中没有命名空间而存在的问题

2.  C++引入了命名空间解决的问题

3.  C++命名空间的重要性

二、命名空间的定义

三、命名空间的使用

1. 指定命名空间访问​编辑

2.  using将命名空间中某个成员展开

3. 展开命名空间中全部成员


 

 注:本文为了将C与C++进行对比,皆使用了printf函数作为示例

 

一、命名空间的重要性

 

1.  C语言中没有命名空间而存在的问题

在C语言中,所有的全局标识符(包括函数名、变量名等)都位于同一个全局作用域中。这导致了几个显著的问题:

  1. 命名冲突:当多个库或模块包含相同名称的函数或变量时,这些标识符之间会发生冲突。开发者需要手动修改名称以避免冲突,这既繁琐又容易出错。

  2. 代码可读性差:随着项目规模的增大,全局作用域中的标识符数量急剧增加,使得代码的阅读和维护变得困难。开发者需要花费更多时间来理解每个标识符的来源和用途。

  3. 模块间耦合度高:由于所有全局标识符都可见,模块间的依赖关系可能变得复杂且难以管理。这增加了代码重构和模块化的难度。

 ​​​

 

比如:

在C语言中,如果定义一个rand全局变量,刚开始,可以正常打印90167588240c4174bfdb0ff0aa0e4dd7.png

 然后,包含了<stdlib.h>头文件之后,就报错了,因为在stdlib头文件中,rand是函数,这里我们又定义了以rand全局变量,就产生了命名冲突

f20cce11aaa44cae88a701df583f9363.png

 

2.  C++引入了命名空间解决的问题

C++通过引入命名空间(namespace)机制来解决上述问题:

  1. 解决命名冲突:命名空间允许开发者将相关的标识符组织在一起,并通过命名空间名称作为前缀来访问这些标识符。这样,即使不同的库或模块包含相同名称的标识符,只要它们位于不同的命名空间中,就不会发生冲突。

  2. 提高代码可读性:命名空间为代码提供了一种自然的分组方式,使得相关的标识符能够按照逻辑或功能进行组织。这有助于开发者快速理解代码的结构和每个标识符的用途。

  3. 降低模块间耦合度:通过限制命名空间成员的可见性,C++可以减少模块间的依赖关系。开发者可以更加灵活地重构和模块化代码,而无需担心意外的命名冲突或依赖问题。

 还是上面的例子,在C++中,将rand全局变量放在了命名空间中后,就不会与头文件中rand函数发生冲突

关于命名空间的定义和使用细则,会在稍后介绍

d9e26fb63cbc49a5aa082b1368f553b7.png

 

3.  C++命名空间的重要性

C++命名空间的重要性体现在以下几个方面:

  1. 支持大型项目:对于大型项目而言,命名空间是组织和管理代码的关键工具。它有助于减少命名冲突、提高代码可读性和可维护性。

  2. 促进模块化编程:命名空间鼓励开发者将代码划分为独立的模块或库,并通过命名空间来区分这些模块或库中的标识符。这有助于实现更加清晰和灵活的模块化编程。

  3. 与标准库集成:C++标准库中的所有内容都定义在std命名空间中。通过使用命名空间,标准库能够与用户代码和谐共存,而不会引发命名冲突。

  4. 增强代码复用性:命名空间使得库和框架的开发者能够更容易地提供可复用的代码。通过定义清晰的命名空间,他们可以避免命名冲突,并确保库或框架中的标识符在与其他代码集成时保持清晰和一致。

总之,C++命名空间是一种强大的代码组织工具,它有助于解决命名冲突、提高代码的可读性和可维护性。通过合理使用命名空间,你可以创建出更加清晰、模块化和可复用的C++代码

 

二、命名空间的定义

  • 定义命名空间——需要使⽤到namespace关键字,后⾯跟命名空间的名字,然后接⼀对{}即可,{}中 即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
  • namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量,所以下 ⾯的rand不在冲突了。
  • C++中域有函数局部域,全局域,命名空间域,类域;域影响的是编译时语法查找⼀个变量/函数/ 类型出处(声明或定义)的逻辑,所有有了域隔离,名字冲突就解决了。局部域和全局域除了会影响 编译查找逻辑,还会影响变量的生命周期;命名空间域和类域不影响变量生命周期,只影响作用域。
  •  namespace只能定义在全局,当然他还可以嵌套定义
  • 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突
  • C++标准库都放在⼀个叫std(standard)的命名空间中

405782351a014fadbf40f7b527d8b4c1.png

 

多文件定义同名的命名空间,它们会被当做是同一个命名空间,自动合并到一起

如下图所示:

deec2bb0f0a947c0b982255d39d7457f.png

132985efed00427189d0e1373c7a58f2.png

 

三、命名空间的使用

 

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以 下⾯程序会编译报错。

所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:

 

  1. 指定命名空间访问项⽬中推荐这种⽅式
  2. using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。
  3. 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤。

 

1. 指定命名空间访问

d9e26fb63cbc49a5aa082b1368f553b7.png

 

2.  using将命名空间中某个成员展开

b920b2a5d5814fa3b355aec8b5ba34ec.png

 

3. 展开命名空间中全部成员

ac0a688a841c4f26848d980e254bb30f.png

 

作为C++命名空间的基础介绍,本文讲解完毕

 

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

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

相关文章

【论文速读】《LLM4CP: Adapting Large Language Models for Channel Prediction》

论文地址&#xff1a; https://ieeexplore.ieee.org/document/10582829 前言&#xff1a;之前就想&#xff0c;大语言模型是否可以通过微调用于通信系统的无线空口应用&#xff0c;这篇文章给出了答案。通过讲信道状态信息进行嵌入和注意力操作&#xff0c;变成大语言模型可以…

Map和Set及哈希--的奥秘(详解)

目录&#xff1a; 一 搜索树&#xff1a; 二. 搜索相关概念 三.Map 的说明 四. Set 的说明 五.哈希表: 一 搜索树&#xff1a; 1.概念&#xff1a; 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树: (1). 若它的左子树不为空&a…

常见中间件漏洞复现之【Jboss】!

Jboss介绍 JBoss是⼀个基于J2EE的开发源代码的应⽤服务器。JBoss代码遵循LGPL许可&#xff0c;可以在任何商业应⽤中免费使⽤。JBoss是⼀个管理EJB的容器和服务器&#xff0c;⽀持EJB1.1、EJB 2.0和EJB3的规范。但JBoss核⼼服务不包括⽀持servlet/JSP的WEB容器&#xff0c;⼀般…

61 函数参数——可变长度参数

可变长度参数在定义函数时主要有两种形式&#xff1a;*parameter 和 **parameter&#xff0c;前者主要用来接收任意多个实参并将其放在一个元组中&#xff0c;后者接收类似于关键参数一样显示赋值形式的多个实参并将其放入字典中。 # 无论调用该函数时传递了多少实参&#xff…

鸿蒙Harmony开发:onFrame逐帧回调规范

通过返回应用onFrame逐帧回调的方式&#xff0c;让开发者在应用侧的每一帧都可以设置属性值&#xff0c;从而实现设置了该属性值对应组件的动画效果。 使用animator实现动画效果 使用如下步骤可以创建一个简单的animator&#xff0c;并且在每个帧回调中打印当前插值。 引入相…

萌新的Java入门日记18

一、mybatis范围筛选 1.第一种表示方法 <!--resultType 查出来的结果自贡每一行都要映射到该类型的对象--><select id"getStaff" resultType"com.easy.bean.Staff">select * from staff<!--根据参数不同组合出不同的SQL语句 动态SQL语句…

java之IO篇——工具包Commons-io和Hutool

前言 结束了IO篇的File、基本流和高级流。还要认识IO流的一些工具包Commons-io和hutool&#xff0c;不算是框架&#xff0c;但是非常实用。 目录 前言 一、Commons-io 1.来历及作用 2.使用 二、Hutool 1.简介 2.使用 一、Commons-io 1.来历及作用 Commons-io是apache…

C++第七篇 模板初阶和STL简介

目录 一&#xff0c;模板初阶 1.泛型编程 2.函数模板 2.1 函数模板概念 2.2 函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5 模板参数的匹配原则 3.类模板(模板类&#xff0c;模板函数) 3.1 类模板定义格式 二&#xff0c;STL简介 1. 什么是STL 2. ST…

【JUC】并发编程与源码分析 1-7章

1 线程基础知识复习 1把锁&#xff1a;synchronized&#xff08;后面细讲&#xff09; 2个并&#xff1a; 并发&#xff08;concurrent&#xff09;&#xff1a;是在同一实体上的多个事件&#xff0c;是在一台机器上“同时”处理多个任务&#xff0c;同一时刻&#xff0c;其…

【学习笔记】A2X通信的协议(三)- A2X PC5通信(一)

目录 6. A2X通信 6.1 A2X PC5通信 6.1.1 一般说明 6.1.2 通过NR-PC5的单播模式A2X通信 6.1.2.1 概述 6.1.2.2 A2X PC5单播链路建立程序 6.1.2.2.1 一般说明 6.1.2.2.2 发起UE启动A2X PC5单播链路建立程序 6.1.2.2.3 目标UE接受的A2X PC5单播链路建立程序 6.1.2.2.5 目…

学单片机怎么在3-5个月内找到工作?

每个初学者&#xff0c;都如履薄冰&#xff0c;10几年前&#xff0c;我自学单片机时&#xff0c;也一样。 想通过学习&#xff0c;找一份体面点的工作&#xff0c;又害怕辛辛苦苦学出来&#xff0c;找不到工作。 好在&#xff0c;当初执行力&#xff0c;还算可以&#xff0c;自…

WebLogic

二、WebLogic 2.1 后台弱口令GetShell 漏洞描述 通过弱口令进入后台界面&#xff0c;上传部署war包&#xff0c;getshell 影响范围 全版本(前提后台存在弱口令) 漏洞复现 默认账号密码:weblogic/Oracle123weblogic常用弱口令: Default Passwords | CIRT.net这里注意&am…

设计模式--结构型

类适配器 #include <queue> #include <iostream> #include <algorithm> #include <iterator>using namespace std;// 目标接口 class Target {public:virtual ~Target() {}virtual void method() 0; };// 适配者类 class Adaptee {public:void spec_…

CHIESI凯西医药:外企入职测评综合能力及性格测试SHL题库测评真题解析

CHIESI凯西医药是一家意大利国际制药集团&#xff0c;以研发为核心&#xff0c;专注于呼吸道健康、罕见疾病和专科治疗的创新治疗方案。集团总部位于意大利帕尔马市&#xff0c;拥有超过85年的历史&#xff0c;业务遍及全球31个国家和地区&#xff0c;拥有7,000多名员工。2023年…

day22(mysql数据库主从搭建)

上午&#xff1a; 1、为mysql添加开机启动chkconfig 2、编辑配置文件my.cnf 3、修改环境变量 4、mysql角色授权 角色不生效 在配置文件中不添加activate_all_roles_on_loginon glibc安装&#xff0c;my.cnf在项目目录之下 rpm安装&#xff0c;my.cnf文件在/etc/my.cnf 5、自…

函数实例讲解(五)

文章目录 提取字符串必学的函数&#xff08;LEFT、MID、RIGHT、LEN、LENB&#xff09;1、LEFT2、RIGHT3、MID4、LEN5、LENB 提取实战套路知多少1、FIND2、ISNUMBER 利用随机函数来抽奖&#xff08;RAND、RANDBETWEEN&#xff09;1、RAND2、RANDBETWEEN 排名的几种套路&#xff…

解决nacos疯狂报错“user nacos not found”

nacos疯狂报错“user nacos not found” 参考博客&#xff1a;https://blog.csdn.net/cnskylee/article/details/137640113 背景&#xff1a;项目启动后一直刷“user nacos not found”报错信息&#xff0c;但是不影响接口调用 解决&#xff1a; 1、将nacos版本切换为2.2.2&am…

ET实现游戏中聊天系统逻辑思路(服务端)

目录 一、准备工作 1.1 前言 1.2 完善聊天服务器 1.3 自定义聊天服消息 二、玩家登录聊天服 2.1 Gate网关与聊天服通讯 2.2 保存玩家实体映射实例ID 三、处理聊天逻辑 3.1 发送聊天消息的定义 3.2 定义聊天记录组件 3.3 编写发送聊天消息处理类 ET是一个游戏框架&…

Linux--shell脚本语言—/—终章

一、shell函数 1、shell函数定义格式 参数说明&#xff1a; 1、可以带function fun() 定义&#xff0c;也可以直接fun() 定义,不带任何参数。 2、参数返回&#xff0c;可以显示加&#xff1a;return 返回&#xff0c;如果不加&#xff0c;将以最后一条命令运行结果&#xff…

(20)SSM-MyBatis关系映射

MyBatis关联映射 概述 在实际开发的工程中&#xff0c;经常对出现多表操作&#xff0c;如果常见的根据某条数据的ID去检索数据&#xff08;根据用户查询订单信息&#xff09;&#xff0c;这个时候我们数据库设计的时候就需要使用外键进行关联&#xff0c;那么mybatis在操作这…