当前位置: 首页 > news >正文

【C++ 记忆站】命名空间

在这里插入图片描述

文章目录

    • 命名空间概念
      • 命名空间的定义
        • 1、正常的命名空间定义
        • 2、命名空间可以嵌套
        • 3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中
      • 命名空间的使用
        • 1、加命名空间名称及作用域限定符
        • 2、使用using将命名空间中某个成员引入
        • 3、使用using namespace 命名空间名称 引入
        • 4、使用using namespace std C++标准库命名空间 引入

在这里插入图片描述

命名空间概念

在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存 在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。

很多人在开始接触C++的时候,知道打印一行 hello world 都是这样写的:

#include
using namespace std;
int main()
{
cout << “hello world” << endl;
}

但是要问你iostream 和 namespace std 是什么,在这行代码中起到什么作用,很多初学者基本上是回答不上来的,就知道怎么写,不知道其中的意义。

那么现在就开始认识命名空间这个概念
大家都知道C++是在c语言基础上建立的,c语言很多地方存在很多缺陷的,C++就创建了一个命名空间的概念来弥补这一缺陷
这一缺陷是什么呢?创建一个全局变量 int rand = 0 ,你只引入了头文件 <stdio.h> ,利用printf打印出rand,不会产生任何问题。可当你再引用了 <stdlib.h> ,再次运行程序就会出现问题
在这里插入图片描述
这里报错,显示rand重定义,这里的问题叫做命名冲突,因为 stdlib.h 这个库里面已经定义了rand,且定义成的一个函数,而我们这个全局变量rand是int类型的元素,系统在识别这个rand的时候就会找到两个rand,它不知道去打印哪一个,当然这里刚好rand在库里面是个函数 且与%d发生冲突,显示两个错误

在c语言中,解决这一问题,最简单粗暴的方法,就是改变量名称,防止与库里面的同名变量命名冲突,这样当然可以解决问题,但如果你在一个团队中需要分组完成一个项目,每个组的个别变量都一样,这时候怎么办,总不能组与组直接吵一架吧,这会大大降低工作效率不说,也影响团队氛围嘛,所以显然这种方法不可取。

在这里插入图片描述
既然c语言不能解决这个问题,那么C++就提出了命名空间来解决
这里就要引入一个关键字 namespace ,它的作用是创建一个域把创建的rand变量保护起来,下面是代码实现

namespace Yuan
{int rand = 0;
}
int main()
{printf("%d\n", rand);
}

namespace 后面的名字随便取什么都行,只要自己记得住
这样就不会产生命名冲突的问题,main里面打印的是库函数里面的rand(准确来说是访问全局的域来找到rand),并不是Yuan里面的rand
要想打印Yuan里面的rand需要在rand前面加Yuan::

namespace Yuan
{int rand = 0;
}
int main()
{printf("%d\n", Yuan::rand);
}

namespace创建的是一个命名为Yuan的局部域,这里需要回顾一下C语言里面的全局变量和局部变量

int i = 0;
int main()
{int i = 1;printf("%d", i);
}

现在问大家一个问题,这里打印的i是0还是1?

答案是1,这里满足一个就近原则,打印结果是1,这里是直接访问的局部域里面的局部变量i

但是如果你想在局部域里面访问全局变量i,怎么办?

需要在i前面加::

int i = 0;
int main()
{int i = 1;printf("%d\n", ::i);printf("%d\n", i);
}

::叫做域作用符,作用是指定在哪个域里面去找这个i,这里::左边是空白,就代表在全局域里面去找

在这里插入图片描述

所以命名冲突问题有了命名空间这个概念,就迎刃而解了。A B C三个小组,每个小组写的所有的变量全都保存在他们自己所定义的命名空间里面,且命名空间分别交nodeA nodeB nodeC,即使各自的命名空间里面有相同的变量,也不会收到任何影响

命名空间的定义

1、正常的命名空间定义

命名空间里面可以定义变量,函数,类型等

namespace Yuan
{int rand = 0;void func(){printf("func()\n");}struct TreeNode{struct TreeNode* left;struct TreeNode* right;int val;};
}int main()
{printf("%p\n", rand);printf("%p\n", Yuan::rand);Yuan::func();struct Yuan::TreeNode node;return 0;
}

2、命名空间可以嵌套

命名空间可以嵌套,就想循环语句一样

namespace sql
{int a = 0;namespace Yuan{int rand = 0;void func(){printf("func()\n");}struct TreeNode{struct TreeNode* left;struct TreeNode* right;int val;};}
}int main()
{printf("%p\n", rand);printf("%p\n", sql::Yuan::rand);sql::Yuan::func();struct sql::Yuan::TreeNode node;return 0;
}

3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中

这一点怎么来理解呢,比如说在一个项目中我们添加了Stack.h(栈),Stack.cpp(栈),Queue.h(队列),Queue.cpp(队列),里面有很多变量,类型,函数等,现在要把它们放到一个命名空间里面,我们会担心发生命名冲突的问题,怎么处理呢?
这四个文件中分别定义一个 每次为 Yuan 的命名空间,并把文件中所有东西放到命名空间中,这四个命名空间名字相同,但不在一个文件中,编译器会自动把它们合并到一个命名空间中,不用担心命名冲突的问题

namespace Yuan
{typedef int STDataType;typedef struct Stack{STDataType* a;int top;		// 栈顶的位置int capacity;	// 容量}ST;
}#include "Stack.h"//栈
#include "Queue.h"//队列int main()
{Yuan::ST st;Yuan::StackInit(&st);Yuan::Queue q;Yuan::QueueInit(&q);
}

命名空间的使用

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

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

前面已经介绍了通过域作用符来进行命名空间的使用,这也是最基本最简单的一种命名空间使用方式,可这个方式如果在命名空间使用比较多的时候就显得有些繁琐了,可能这里没有加域作用符,那里又没有加,导致一堆bug,所以就有了以下三种方式

2、使用using将命名空间中某个成员引入

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

3、使用using namespace 命名空间名称 引入

using namespce N;
int main()
{printf("%d\n", Yuan::a);printf("%d\n", b);Add(10, 20);return 0;  
}

4、使用using namespace std C++标准库命名空间 引入

前面两种相对就比较保守,这个就是很大胆的直接展开C++全部标准库,虽然是很大程度上避免了一定的冲突,但是这样全部展开,就可能存在冲突的风险,所以直接全部展开不推荐使用,如果要用应该是这样写

#include<iostream>
//using namespace std
int main()
{std::cout << "hello world" << std::endl;return 0;
}

在这里插入图片描述

相关文章:

【C++ 记忆站】命名空间

文章目录 命名空间概念命名空间的定义1、正常的命名空间定义2、命名空间可以嵌套3、同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中 命名空间的使用1、加命名空间名称及作用域限定符2、使用using将命名空间中某个成员引入3、使用using namespac…...

《离散数学及其应用(原书第8版)》ISBN978-7-111-63687-8 第11章 11.1.3 树的性质 节 第664页的例9说明

《离散数学及其应用&#xff08;原书第8版&#xff09;》ISBN978-7-111-63687-8 第11章 11.1.3 树的性质 节 第664页的定理3的引申 定理3 带有i个内点的m叉树含有nmi1个顶点 见本人博文 内点定义不同的讨论 如果对于一个m叉正则树&#xff0c;即任意分支节点的儿子恰好有m个&am…...

【云原生】K8S存储卷:PV、PVC详解

目录 一、emptyDir存储卷二、hostPath存储卷三、nfs共享存储卷四、PVC 和 PV4.1 NFS使用PV和PVC4.2创建动态PV 一、emptyDir存储卷 容器磁盘上的文件的生命周期是短暂的&#xff0c;这就使得在容器中运行重要应用时会出现一些问题。首先&#xff0c;当容器崩溃时&#xff0c;ku…...

谈谈IP地址和子网掩码的概念及应用

个人主页&#xff1a;insist--个人主页​​​​​​ 本文专栏&#xff1a;网络基础——带你走进网络世界 本专栏会持续更新网络基础知识&#xff0c;希望大家多多支持&#xff0c;让我们一起探索这个神奇而广阔的网络世界。 目录 一、IP地址的概念 二、IP地址的分类 1、A类 …...

vue2 如何监听数组的变化

在Vue 2中&#xff0c;底层是通过重写数组的原型方法来实现对数组变化的监听。具体来说&#xff0c;Vue 2使用了一个名为Observer的类来劫持数组的原型方法&#xff0c;使其在调用这些方法时能够触发相应的变化通知。 当Vue 2初始化一个响应式对象时&#xff0c;如果对象是一个…...

CSS中的transform属性有哪些值?并分别描述它们的作用。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ translate()⭐ rotate()⭐ scale()⭐ skew()⭐ matrix()⭐ scaleX() 和 scaleY()⭐ rotateX()、rotateY() 和 rotateZ()⭐ translateX() 和 translateY()⭐ skewX() 和 skewY()⭐ perspective()⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&…...

vue3跳转页面后 海康监控实例不销毁

第一个页面是这样的 跳转到新的页面 只有海康的监控没有消失 使用控制台审查元素也审查不到 解决方法&#xff1a;在vue3的销毁周期把海康的监控销毁掉 import { reactive, onDeactivated} from "vue"; const state reactive({oWebControl: null as any, //监控绑…...

Unity 射线检测

文章目录 1. 定义2. 重要类和方法2.1 Ray2.2 从屏幕发出射线&#xff1a;2.3 Raycast2.4 RaycastAll2.5 RaycastHit 碰撞信息2.6 layerMask 让射线检测只检测指定层级的对象 1. 定义 在Unity中&#xff0c;射线检测&#xff08;Raycasting&#xff09;是一种常用的技术&#x…...

微信支付报非法的密钥大小: Caused by: java.security.InvalidKeyException: Illegal key size

在Linux环境中出现 java.security.InvalidKeyException: Illegal key size 异常通常是由于Java默认的加密限制引起的。Java默认的加密强度限制了加密算法密钥的最大长度 方式一 1. 找到该目录 /usr/java/jdk1.8.0_121/jre/lib/security 2. 替换local_policy.jar 和 US_export_…...

React 调试开发插件 React devtools 的使用

可以在谷歌扩展应用商店里获取这个插件。如果不能访问谷歌应用商店&#xff0c;可以点此下载最新版 安装插件后&#xff0c;控制台出现 “Components” 跟 “Profiler” 菜单选项。 查看版本&#xff0c;步骤&#xff1a; 下面介绍 react devtools 的使用方式。 在 Component…...

linux 搜索命令

搜索命令 locate命令 搜索速度快&#xff0c;是按照数据库进行搜索的(数据库位置在/var/lib/mlocate/mlocate.db) locate abc.txt 这个数据库是在半夜通过cron执行updatedb建立的&#xff0c;有时候新创建的文件使用locate来搜索文件搜索不到&#xff0c;可能是因为文件的索引还…...

如何使用Spark/Flink等分布式计算引擎做网络入侵检测

如何使用Spark/Flink等分布式计算引擎做网络入侵检测 引言16 Distributed Abnormal Behavior Detection Approach Based on Deep Belief Network and Ensemble SVM Using Spark17 Spark configurations to optimize decision tree classification on UNSW-NB1518 A dynamic spa…...

基于php驾校驾驶理论考试模拟系统

驾校驾驶理论考试模拟系统&#xff0c;是基于php编程语言&#xff0c;mysql数据库进行开发&#xff0c;本系统分为用户和管理员两个角色&#xff0c;其中用户可以注册登陆系统&#xff0c;查看考试规则&#xff0c;进行驾照考试&#xff0c;查看考试得分&#xff0c;考试错题&a…...

vue3+elementPlus table里添加输入框并提交校验

<template><div><el-form :model"info" ref"forms"><el-tableref"tableRef":data"info.data"border><el-table-column align"center" property"name" label"*姓名"><…...

ios swift5 collectionView 瀑布流(两列)

文章目录 1.瀑布流1.1 demo地址1.2 记得把部署的最低版本由8改成11,13甚至更高。不然编译会报错 2.动态计算图片和文字的高度 1.瀑布流 1.1 demo地址 CollectionViewWaterfallLayout - github 1.2 记得把部署的最低版本由8改成11,13甚至更高。不然编译会报错 2.动态计算图片和…...

创建一个简单的HTML Viewer应用程序

使用wxPython和内嵌浏览器来创建一个简单的HTML Viewer应用程序。 在本篇文章中&#xff0c;我们将使用Python和wxPython模块来创建一个简单的HTML Viewer应用程序。这个应用程序可以让用户输入HTML内容&#xff0c;并在内嵌浏览器中显示该内容的效果。 准备工作 在开始之前…...

无公网IP,公网SSH远程访问家中的树莓派教程

文章目录 前言 如何通过 SSH 连接到树莓派步骤1. 在 Raspberry Pi 上启用 SSH步骤2. 查找树莓派的 IP 地址步骤3. SSH 到你的树莓派步骤 4. 在任何地点访问家中的树莓派4.1 安装 Cpolar内网穿透4.2 cpolar进行token认证4.3 配置cpolar服务开机自启动4.4 查看映射到公网的隧道地…...

「UG/NX」Block UI 超级截面SuperSection

✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#...

高层建筑全景vr火灾隐患排查模拟培训软件助力群众防范火灾伤害

随着城市化进程的加快&#xff0c;楼宇建筑的数量也在不断增加。然而&#xff0c;楼宇消防安全问题也日益突出。为了提高楼宇员工和居民的消防安全意识&#xff0c;楼宇VR消防安全教育培训应运而生。VR安全培训公司深圳华锐视点制作的楼宇vr消防安全教育培训&#xff0c;包括消…...

【WPF】 本地化的最佳做法

【WPF】 本地化的最佳做法 资源文件英文资源文件 en-US.xaml中文资源文件 zh-CN.xaml 资源使用App.xaml主界面布局cs代码 App.config辅助类语言切换操作类资源 binding 解析类 实现效果 应用程序本地化有很多种方式&#xff0c;选择合适的才是最好的。这里只讨论一种方式&#…...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

Visual Studio Code 扩展

Visual Studio Code 扩展 change-case 大小写转换EmmyLua for VSCode 调试插件Bookmarks 书签 change-case 大小写转换 https://marketplace.visualstudio.com/items?itemNamewmaurer.change-case 选中单词后&#xff0c;命令 changeCase.commands 可预览转换效果 EmmyLua…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

​​企业大模型服务合规指南:深度解析备案与登记制度​​

伴随AI技术的爆炸式发展&#xff0c;尤其是大模型&#xff08;LLM&#xff09;在各行各业的深度应用和整合&#xff0c;企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者&#xff0c;还是积极拥抱AI转型的传统企业&#xff0c;在面向公众…...