当前位置: 首页 > 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;选择合适的才是最好的。这里只讨论一种方式&#…...

VS2017编译同事VS2022创建的库,报错无法运行rc.exe

项目场景&#xff1a; 项目场景&#xff1a;有一个qt的版本&#xff0c;迁移到VS中进行开发编译&#xff0c;同事使用的是VS2022已经编译成功。但是拷贝到我电脑&#xff0c;我使用VS2017打开编译&#xff0c;却报错&#xff1a;报错无法运行rc.exe。 原因分析&#xff1a; 1.…...

Leetcode49. 字母异位词分组

给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 解题思路&#xff1a;计数 思路&#xff1a;题意是字符串的字符都是小写&#xff0c;可以对每个字符串统计其中字符的…...

设计模式之工厂方法模式(FactoryMethod)

一、概述 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。FactoryMethod使一个类的实例化延迟到其子类。 二、适用性 1.当一个类不知道它所必须创建的对象的类的时候。 2.当一个类希望由它的子类来指定它所创建的对象的时候。 3.当类将创建对象的职责委…...

python的进度条tqdm库,显示时进度条不换行设置

问题描述 tqdm库&#xff0c;显示时进度条不要换行&#xff0c;直接在一行里显示当前进度 换行显示&#xff1a; 不换行显示 解决方案&#xff08;参考链接&#xff09; 添加参数position0 和 leaveTrue 举例&#xff1a; 修改前&#xff1a; import tqdm import time f…...

spark的使用

spark的使用 spark是一款分布式的计算框架&#xff0c;用于调度成百上千的服务器集群。 安装pyspark # os.environ[PYSPARK_PYTHON]解析器路径 pyspark_python配置解析器路径 import os os.environ[PYSPARK_PYTHON]"D:/dev/python/python3.11.4/python.exe"pip inst…...

力扣:66. 加一(Python3)

题目&#xff1a; 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 来源&#xff1a;力扣&#xf…...

Go的标准库Context理解

作为一个才入门的菜鸟&#xff0c;还没写过真正的 go 项目&#xff0c;要理解这个 Context 还是有点难&#xff0c;不过还是要尝试一下。在 Go http包的Server中&#xff0c;每一个请求在都有一个对应的 goroutine 去处理。请求处理函数通常会启动额外的 goroutine 用来访问后端…...

Nuxt3_1_路由+页面+组件+资源+样式 使用及实例

1、 简介 1.1 开发必备 node版本 v16.10.0 我使用的是16.14.0编辑器推荐使用Volar Extension 的VS code插件Terminal 运行nuxt指令 1.2 环境搭建 安装项目&#xff1a; npx nuxilatest init [first_nuxt3]进入项目目录&#xff1a; cd [first_nuxt3]安装依赖&#xff1a;n…...

Kafka第三课

Flume 由三部分 Source Channel Sink 可以通过配置拦截器和Channel选择器,来实现对数据的分流, 可以通过对channel的2个存储容量的的设置,来实现对流速的控制 Kafka 同样由三大部分组成 生产者 服务器 消费者 生产者负责发送数据给服务器 服务器存储数据 消费者通过从服务器取…...

elasticsearch修改es集群的索引副本数量

前言 最近es集群进行调整&#xff0c;从2节点变成了单节点。所以需要将集群模式改为单点模式&#xff0c;并需要将es 集群的全部索引副本个数改为0&#xff0c;不然会有很多未分配的分片&#xff0c;导致集群状态为 yellow。 具体实践 1. 先将现有的index的副本数量为0个 此…...