C++ 之命名空间namespace【详解】

文章目录

  • 一,命名空间出现的意义
  • 二,命名空间的定义
    • 命名空间里面可以包含变量,函数,类型:
    • 命名空间不可以定义在局部作用域:
    • 命名空间可以嵌套:
  • 三,同一个工程中允许存在多个相同名称的命名空间,编译器最后会将其合并成一个命名空间,不会报错:
    • 允许存在未命名的名称空间
  • 四,命名空间的使用
    • 加命名空间名称及作用域限定符
    • 使用using将命名空间的某个成员引入(using声明)
    • 使用“using namespace 命名空间名称 ”引入(using编译指令)
  • 五,命名空间的使用建议

一,命名空间出现的意义

命名空间(Namespace)在编程中的作用主要有以下几点意义

  • 避免命名冲突:命名空间提供了一种将标识符(如变量、函数、类等)组织和隔离的方式。不同的命名空间可以拥有相同名称的标识符,避免了不同模块或库之间的命名冲突。
  • 提高可读性和可维护性:通过使用命名空间,可以更清晰地表示代码中的层次结构和组织关系。这样,其他开发者可以更容易理解代码,并且在开发或维护时可以更方便地定位和修改相关部分。
  • 模块化和组件化:命名空间可以用于划分代码逻辑上的模块和组件。每个命名空间可以包含相关的函数、类、常量等,实现了代码的模块化和组件化,使得代码更加可组织和易于扩展。
  • 提供封装和访问控制:命名空间可以用于封装代码,并提供对外部的访问控制。通过在命名空间中定义私有成员和公共接口,可以限制对命名空间内部的访问,增强代码的安全性和稳定性。
  • 支持库和框架开发:命名空间为库和框架的开发提供了一种清晰的组织结构。不同的模块可以通过命名空间进行逻辑上的分割和集成,使得库和框架更易于使用和扩展。
      总的来说,命名空间提供了一种组织、隔离和管理代码的机制,有助于避免命名冲突、提高可读性和可维护性,以及支持模块化和封装。它在大型项目或多人协作开发中尤为重要,能够提高代码的可靠性和可扩展性。

  最重要的一点还是命名冲突,下面举个例子能够直观的感受:

#include<stdlib.h>
#include <stdio.h>int rand = 9;
int main()
{printf("%d", rand);return 0;
}

运行以后,这段代码会出现这样的错误:
在这里插入图片描述
因为在头文件stdlib.h里面定义了rand,然后我们又自定义了一个rand,就会出现重定义这个现象
  这个问题的危害就是在公司做大型项目的时候,每个人都会定义很多变量,当整合在一起的时候,就会出现很多的重定义现象,这个问题在C语言里面是无解的,只能一方去妥协。在C++里面就解决了这个问题,引入了命名空间

二,命名空间的定义

  命名空间的定义需要用到namespace关键字,后面跟上一对**{}**,{}里面包含了命名空间的成员。


命名空间里面可以包含变量,函数,类型:

namespace tanghuan
{int a = 10;int arr[10] = { 0 };int sum(int a, int b){return a + b;}struct N{int i = 0;};
}int main()
{return 0;
}

命名空间不可以定义在局部作用域:

在这里插入图片描述

命名空间可以嵌套:

namespace tanghuan
{namespace Test{int u = 9;}int a = 10;int arr[10] = { 0 };int sum(int a, int b){return a + b;}struct N{int i = 0;};
}int main()
{return 0;
}

三,同一个工程中允许存在多个相同名称的命名空间,编译器最后会将其合并成一个命名空间,不会报错:

在这里插入图片描述
但是不允许存在相同变量/函数/类型,否则会报错:
在这里插入图片描述

允许存在未命名的名称空间

#include <stdio.h>
namespace
{int a = 10;int arr[10] = { 0 };int sum(int a, int b){return a + b;}struct N{int i = 0;};
}
int main()
{printf("%d ", a);
}

  这种命名空间没有名称,就不能使用using声明和using编译指令来使他在其他位置也可用,从某方面来看,他和全局变量相似,具有内部链接性,也就是不能在命名空间所属文件以外的地方使用该命名空间里面的成员。

在这里插入图片描述


一个命名空间的定义就相当于给其中的成员围上了栏杆,没有允许的话,任何人都不能访问其中的变量,不同命名空间里面即使是相同的变量名,但是本质是两个变量:
在这里插入图片描述

但是套上了不同命名空间的"牌子",编译器就能正确区别出他们啦。

四,命名空间的使用

先介绍一下:

  • :: 叫做域作用限定符。
  • using 也是属于C++的关键字。

命名空间的使用有三种方式:
用于测试的已经定义好的命名空间:

#include <stdio.h>
namespace tanghuan
{int a = 10;int arr[10] = { 0 };int sum(int a, int b){return a + b;}struct N{int i = 0;};
}

加命名空间名称及作用域限定符


int main()
{printf("%d\n", tanghuan::a);return 0;
}

使用using将命名空间的某个成员引入(using声明)

using tanghuan::a;
int main()
{printf("%d", a);return 0;
}

使用“using namespace 命名空间名称 ”引入(using编译指令)

using namespace tanghuan;
int main()
{printf("%d\n", a);printf("%d", sum(1, 2));return 0;
}

注意:

  • using声明和using编译指令可以使用在全局,此时全局展开,也可在局部使用,此时仅仅在局部有用:
    在这里插入图片描述

  • using声明和using编译指令在局部使用的时候,和其他的局部变量一样,会覆盖全局的同名函数:
    在这里插入图片描述

五,命名空间的使用建议

  1. 使用在已经命名的名称空间中声明的变量,而不是使用外部全局变量。
  2. 使用在已经命名的名称空间中声明的变量,而不是使用静态全局变量。
  3. 不要在头文件中使用using编译指令,首先,这样做掩盖了要让那些名称可用。另外,包含头h文件的顺序可能影响程序的行为。如果非要使用编译指令using,应该将其放在所有预处理编译指令#include之后。
  4. 导入名称时,首选将其作用域解析运算符或者using声明的方法。
  5. 对于using声明,首选将其作用域解析运算符设置为局部而不是全局。

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

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

相关文章

Axios 通过a标签下载文件 跨域下载

<!-- a标签占位 --><a ref"down" ></a>getTest() {this.$axios.request({url: https://cnv13.55.la/download?file_key3695fa9461a0ae59cf3148581e4fe339&handle_typeexcel2pdf,method: get,responseType: blob, // 切记类型 blob}).then(re…

语音识别技术在医疗行业中的应用案例

随着语音识别技术和计算机视觉技术的不断提高&#xff0c;现代医学正在进入全面数字化时代。 追求高质量的训练数据是人工智能产业的信条&#xff0c;得到更为精准的语音机器模型更离不开语音数据的不断供给。本文讲介绍: 什么是语音识别技术语音识别技术如何应用于医疗行业 …

shell 脚本的函数和数组

函数 —— 封装的一个公式&#xff1a;sin、cos、tan —— 函数为脚本的别名 —— 函数就是一个功能模块&#xff0c;在函数中写执行的命令即可&#xff1b;使用函数可以避免代码重复&#xff0c;增加可读性&#xff0c;简化脚本&#xff0c;使用函数可以将大的工程分割为若…

JSP过滤器和监听器

什么是过滤器 Servlet过滤器与Servlet十分相似&#xff0c;但它具有拦截客户端&#xff08;浏览器&#xff09;请求的功能&#xff0c;Servlet过滤器可以改变请求中的内容&#xff0c;来满足实际开发中的需要。 对于程序开发人员而言&#xff0c;过滤器实质就是在Web应用服务器…

九、ffmpeg命令转封装

开了几天小差&#xff0c;今天继续学习ffmpeg。 准备测试使用的视频&#xff0c;并查看其信息 # 查看视频信息。使用Mediainfo也可以 ffprobe test.mp4 视频格式的信息如下。 保持编码格式&#xff1a;ffmpeg -i test.mp4 -vcodec copy -acodec copy test_copy.tsffmpeg -i…

Unity地面交互效果——6、地形动态顶点置换和曲面细分

回到目录 Unity置换贴图局部距离曲面细分 大家好&#xff0c;我是阿赵。   这篇文章是我无聊的时候做了一个demo&#xff0c;觉得挺有趣&#xff0c;于是就发上来。这里面包含了4个内容&#xff1a;置换贴图、顶点偏移、局部曲面细分&#xff0c;曲面细分按距离调整强度。 …

Jmeter快速入门

文章目录 1.安装Jmeter1.1.下载1.2.解压1.3.运行 2.快速入门2.1.设置中文语言2.2.基本用法 1.安装Jmeter Jmeter依赖于JDK&#xff0c;所以必须确保当前计算机上已经安装了JDK&#xff0c;并且配置了环境变量。 1.1.下载 可以Apache Jmeter官网下载&#xff0c;地址&#xf…

Volcano3D绘制3D火山图

一边学习&#xff0c;一边总结&#xff0c;一边分享&#xff01; 本期教程内容 **注&#xff1a;**本教程详细内容 Volcano3D绘制3D火山图 一、前言 火山图是做差异分析中最常用到的图形&#xff0c;在前面的推文中&#xff0c;我们也推出了好几期火山图的绘制教程&#xff0…

ELK企业级日志分析平台——ES集群监控

启用xpack认证 官网&#xff1a;https://www.elastic.co/guide/en/elasticsearch/reference/7.6/configuring-tls.html#node-certificates 在elk1上生成证书 [rootelk1 ~]# cd /usr/share/elasticsearch/[rootelk1 elasticsearch]# bin/elasticsearch-certutil ca[rootelk1 ela…

windows下rust调试运行环境部署

1&#xff0c;rust编译环境安装 在联网环境下&#xff0c;建议使用rustup-init.exe程序安装&#xff08;本文使用的改模式) 选择1“默认"进行安装&#xff0c;默认安装x86_64-pc-windows-msvc 在安装完成后&#xff0c;后续为了配置gbd调试&#xff0c;也安装上x86_64-pc-…

AdaBoost提升分类器性能

目录 AdaBoost算法原理 AdaBoost工作详情 初始权重分配 第一轮 第二轮 后续轮次 最终模型 AdaBoost的API解释 AdaBoost 对房价进行预测 AdaBoost 与决策树模型的比较 结论 AdaBoost算法原理 在数据挖掘中&#xff0c;分类算法可以说是核心算法&#xff0c;其中 Ada…

XC2303 PFM 升压 DC-DC 变换器 SOT23-3封装 体积小 外围简单 适合小电流产品

XC2303系列产品是一种高效率、低纹波、工作频率高的 PFM 升压 DC-DC 变换器。XC2303系列产品仅需要四个元器,就可完成将低输入的电池电压变换升压到所需的工作电压&#xff0c;非常适合于便携式1~4 节普通电池应用的场合。 电路采用了高性能、低功耗的参考电压电路结构&#xf…