c++之命名空间详解(namespace)

引例

在学习之前我们首先了来看这样一个情形:

在c语言下,我们写了两个头文件:链表和顺序表的。我们会定义一个type(typedef int type)方便改变数据类型(比如将int改成char),来做到整体代换。

但是我们两个头文件里面都有type,我们又同时引用两个头文件,就会导致type重定义。而解决办法就要宏条件,所以很麻烦修改。

命名空间

那么我们今天学的东西就可以解决以上问题。

首先我们要了解一个基础知识,我们代码只会查看公共空间(全局,和局部),对于创建的空间是没有权限访问的

关键词 namespace

这个是命名空间的意思,因为我们在写代码的时候,定义的变量、函数、类都可能会相同,有报错的风险,所以我们就可以将他们放到不同的空间里面,将它面隔离开来。

我们看以下代码

这里有两个参数一样的add函数,系统肯定会报错,因为不知道用哪个,那么我们就可以将其中一个用命名空间包括起来

命名空间的创建

以上就是我们创建的命名空间叫dgj

这个空间里面有整形a,函数add

那么就只能访问下面的add和局部变量a。

如果我们要访问dgj里面的东西怎么办呢?

空间限定操作符 ::

我们只要在对于变量、函数、类之前加上“命名空间::”就可以限定空间了

我们之前的结果是

将代码改成

那么就会变成

另外对于一下函数我们如何访问全局变量a呢?

我们只要这样就行

如果::之前没有命名空间,那么就是指的全局空间。

标准命名空间 

我们在引用官方头文件的时候,我们自己写的函数也有可能和官方函数有重名,那么我们的也有官方命名空间std(standard)来区分。自行观察我们就可以发现我们用到官方的cout和endl函数都必须要加std::它们不属于全局空间和局部空间,如果不加限定是访问不到的。

命名空间的合并性

我们写头文件一般有.h和.cpp两个文件,那么为了防止重名我们两个文件都要被命名空间括起来。

是不是要定义两个命名空间呢?不是,我们只要定义一个命名空间,编译器会自动把它当作整体。

那不然我们的官方头文件有很多,官方命名空间就不是一个std了。

在同一个文件里面也可以写多个相同名字的命名空间,也是当作一个命名空间

命名空间的展开

我们可能经常用某个命名空间,一直用“命名空间::”不是很方便,所以我们可以直接展开某个命名空间,那么接下来的代码的变量、函数、类就会优先使用这个命名空间的,除非用“命名空间::”指明是其他命名空间的。

语法就是(以std为例)

那么在下面的代码我们就会默认使用std命名空间的,里面的cout、endl也不需要用::来限定空间。

注意:这里的展开和我们头文件的展开是不同的,我们学过文件的编译链接就知道我们的头文件是在预编译展开成代码插入到我们的代码里面的。但是我们的命名空间并不是展开成什么代码,只是一种虚拟的展开。

单独展开命名空间里面的某一个变量、函数、类

但是我们直接展开一个比较大的命名空间,也是会有可能出现重定义的,特别是在以后的工作里面。所以我们可以只展开某个常用命名空间的某一个。

例如我们用dgj这个命名空间来举例:

那么下面的变量a就是优先使用命名空间dgj里面的东西。而出了这个以外的东西就不是默认使用的。

命名空间的嵌套

命名空间是可以在命名空间里面定义的,举例:

这个命名空间就有两个子命名空间。

如果要使用就是

或者只是用其中的一个

或者不展开,我们只是限制命名空间:

就是像剥洋葱一样一层一层向里。

类的命名空间举例

另外我这里举例类的相关例子:

这里的类也是一个对应的命名空间,那么我们可以限定空间来操作里面的变量、函数等。

命名空间的实际运用

例如一个公司要搞一个项目,然后项目肯定要分项目组,比如美术页面,底层逻辑等等,最后这些项目是要合到一起的。所以为了防止重定义,就让这几个项目组创建自己的命名空间例如A,B,C,D...

然后在项目A里面就会有很多人,为了防止这些人的命名重复导致重定义,那么每个人都会有一个命名空间,这里也体现了嵌套命名空间的意义。

那么通过上面的操作,我们就可以完美的避免合代码时出现重定义等相关错误。

看到最后了,觉得不错的就点个赞吧🙂

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

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

相关文章

运维锅总详解系统设计原则

本文对CAP、BASE、ACID、SOLID 原则、12-Factor 应用方法论等12种系统设计原则进行分析举例,希望对您在进行系统设计、理解系统运行背后遵循的原理有所帮助! 一、CAP、BASE、ACID简介 以下是 ACID、CAP 和 BASE 系统设计原则的详细说明及其应用举例&am…

98.验证二叉搜索树——二叉树专题复习

递归: class Solution {// 判断二叉搜索树是否有效public boolean isValidBST(TreeNode root) {// 递归地检查以 root 为根的子树是否满足 BST 的性质// 同时定义一个范围 [Long.MIN_VALUE, Long.MAX_VALUE] 来约束节点的值return isValidBST(root, Long.MIN_VALUE…

SpringBoot拦截器

目录 一、拦截器快速入门 (1)什么是拦截器 (2)拦截器的使用步骤 1、定义拦截器 🍀preHandle() 方法 🍀postHandle() 方法 🍀afterCompletion() 方法 2、注册配置拦截器 二、拦截器详解…

中国剩余定理

模板代码&#xff1a; #include<bits/stdc.h> using namespace std; using ll long long; #define fi first #define se second const ll mod998244353; const int N2e510; #define int llint n,m[300],r[300]; int exgcd(int a,int b,int &x,int &y){if(b0){x…

如何用Vue3和Plotly.js打造交互式仪表盘

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 Vue.js 中使用 Plotly.js 创建指示器卡片 应用场景介绍 指示器卡片是一种用于可视化数据并提供关键见解的交互式组件。它们通常用于仪表板、分析应用程序和监控系统。Plotly.js 是一个流行的 JavaScript 库&a…

Kotlin linkedMapOf filterKeys

Kotlin linkedMapOf filterKeys fun main(args: Array<String>) {val lhm linkedMapOf<String, Any>(Pair("name", "phil"), //因为key相同都为 name&#xff0c;被后面的覆盖。Pair("year", 2024),Pair("name", "f…

Face_recognition实现人脸识别

这里写自定义目录标题 欢迎使用Markdown编辑器一、安装人脸识别库face_recognition1.1 安装cmake1.2 安装dlib库1.3 安装face_recognition 二、3个常用的人脸识别案例2.1 识别并绘制人脸框2.2 提取并绘制人脸关键点2.3 人脸匹配及标注 欢迎使用Markdown编辑器 本文基于face_re…

无法下载 https://mirrors./ubuntu/dists/bionic/main/binary-arm64/Packages

ubuntu系统执行sudo apt update命令的时候&#xff0c;遇到如下问题&#xff1a; 忽略:82 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/universe arm64 Packages 错误:81 https://mirrors.tuna.tsinghua.edu.cn/ubuntu bionic-backports/main arm64 Packa…

Oracle 19c 统一审计表清理

zabbix 收到SYSAUX表空间告警超过90%告警&#xff0c;最后面给出的清理方法只适合ORACLE 统一审计表的清理&#xff0c;传统审计表的清理SYS.AUD$不适合&#xff0c;请注意。 SQL> Col tablespace_name for a30 Col used_pct for a10 Set line 120 pages 120 select total.…

Vue 3 中集成 ECharts(附一些案例)

Vue 3 中集成 ECharts 的完全指南 引言 在现代Web开发中&#xff0c;Vue 3以其卓越的性能和灵活的Composition API赢得了广泛的关注。而ECharts&#xff0c;作为开源的一个使用JavaScript实现的强大可视化库&#xff0c;以其丰富的图表类型和高度可定制性成为了数据可视化的首…

EAI四个层次服务-系统架构师(二十六)

1、&#xff08;重点&#xff09;系统应用集成提供了4个不同层次服务&#xff0c;最上层服务是&#xff08;&#xff09;服务。 解析: EAI&#xff08;Enterprise Application Integration&#xff09;系统应用集成&#xff0c;相关概念。 实施EAI必须保证&#xff1a;应用程…

超详细版阿里云控制台环境配置+数据库配置

一、登录阿里云控制台 登录阿里云控制台&#xff0c;找到实例&#xff0c;切到阿里云服务器所在地址 &#x1f36d;不知道自己的服务器地址在哪边也没有关系&#xff0c;随便选择一个&#xff0c;查询不到记录的话会有以下提示&#xff0c;可以根据提示进行切换&#xff08;适…

贝叶斯估计(1):期末大乱炖

写在前面&#xff01; 1 先验分布和后验分布 三种信息&#xff1a;总体信息、样本信息、先验信息 总体信息&#xff1a;“总体是正态分布”&#xff1b;样本信息&#xff1a;总体抽取的样本提供的信息&#xff0c;是最新鲜的信息&#xff1b;先验信息&#xff1a;在抽样之前就…

罗剑锋的C++实战笔记学习(二):容器、算法库、多线程

4、容器 1&#xff09;、容器的通用特性 所有容器都具有的一个基本特性&#xff1a;它保存元素采用的是值&#xff08;value&#xff09;语义&#xff0c;也就是说&#xff0c;容器里存储的是元素的拷贝、副本&#xff0c;而不是引用 容器操作元素的很大一块成本就是值的拷贝…

DBA 数据库管理

数据库&#xff1a;存储数据的仓库 数据库服务软件&#xff1a; 关系型数据库&#xff1a; 存在硬盘 &#xff0c;制作表格的 数据库的参数 [rootmysql50 ~]# cat /etc/my.cnf.d/mysql-server.cnf 主配置文件 [mysqld] datadir/var/lib/mysql 存放数据库目录…

浅谈信息技术高效课堂管理:策略、技巧与实践

引言&#xff1a; 在信息化教育的浪潮中&#xff0c;信息技术课程正逐渐成为学校教育体系中的重要组成部分。然而&#xff0c;信息技术课堂的特殊性——高互动性、高度依赖电子设备&#xff0c;给课堂管理带来了前所未有的挑战。如何在保证教学效率的同时&#xff0c;维护良好…

多端多商户自定义DIY商城小程序源码系统 前后端分离 带完整的安装代码包以及搭建教程

系统概述 在当今数字化时代&#xff0c;电子商务的发展日新月异&#xff0c;为了满足不断变化的市场需求和用户期望&#xff0c;我们自豪地推出了一款具有前瞻性的创新产品——多端多商户自定义 DIY 商城小程序源码系统。这款系统不仅具备前后端分离的先进架构&#xff0c;还配…

git 禁止dev合并到任何其他分支

创建 pre-merge-commit 钩子 导航到 Git 仓库的钩子目录&#xff1a; cd /path/to/your/repo/.git/hooks创建或编辑 pre-merge-commit 钩子&#xff1a; 也可以通过指令创建 nano pre-merge-commit在钩子文件中添加以下代码&#xff1a; #!/bin/sh# 获取当前分支名称 curr…

使用tcpdump抓取本本机的所有icmp包

1、抓取本机所有icmp包 tcpdump -i any icmp -vv 图中上半部分&#xff0c;是源主机tmp179无法ping通目标主机192.168.10.79&#xff08;因为把该主机关机了&#xff09;的状态&#xff0c;注意看&#xff0c;其中有unreachable 图中下半部分&#xff0c;是源主机tmp179可以p…

RIP环境下的MGRE网络

首先将LSP的IP地址进行配置 其他端口也进行同样的配置 将serial3/0/1配置25.0.0.2 24 将serial4/0/0配置35.0.0.2 24 将GE0/0/0配置45.0.0.2 24 进行第二步 R1与R5之间使用ppp的pap认证 在R5中进行配置 在aaa空间中创建账号和密码 将这个账号和密码使用在ppp协议中 然后…