命名空间.cpp

目录

前序

什么是命名空间

为什么要使用命名空间

命名函数的定义

默认访问变量的顺序

命名空间的几种情况

不同命名空间中出现相同的命名

多个命名相同的命名空间

命名空间嵌套

命名空间的展开 

展开命名空间的缺点


前序

相信大家在cpp代码中经常可以看到头文件下面看到using namespace std这样一个语句,每次写c++代码时都要加上这句话,否则就会报错,不知道这句话酒精有什么作用,是什么意思;其实这是c++提供的命名空间;

什么是命名空间

所谓的命名空间就是一个域,可以由我们自己创造,我们可以在其中定义各种变量、函数、结构体、类等等;

为什么要使用命名空间

由于C++大量存在的标识符(变量、函数和类的名称),并且这些标识符处于全局作用域中,为避免命名冲突或命名污染namespace对这些标识符的名称进行了本地化,使编译器在全局作用域中不直接检索到这些标识符。
下面我们来看一段代码:

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

这段代码其实是可以成功运行的,但即使能够运行,也是有着严重的缺陷,我在全局域中定义了一个变量rand,rand是什么?我们通常用来产生随机数的一个函数,rand是一个函数的名字,因此命名上发生了冲突; 我们试想一个公司员工在进行一个项目的时候,代码量可想而知是十分巨大的,在这其中存在着各种各样的命名,不免有些命名“撞”到一块去,引发冲突,就很难受了,而命名空间就是解决这样的问题而出现;

命名函数的定义

定义命名空间需要使用关键字namespace,顾名思义,就是命名空间的意思;我们依旧一上面的代码为例,倘若我将rand放在命名空间里面然后进行访问是不是就不会发生冲突了;
代码如下:

#include<stdio.h>
namespace bit {int rand = 20;int add(int a,int b){return a+b;//函数、结构体也是可以的}
}int main(){printf("%d", bit::rand);return 0;}

 需要注意的是1.访问命名空间内容时,需要指明是哪个命名空间,因为命名空间不只可以定义一个,以bit::rand这样的形式进行访问其中的元素、函数等等;
2.命名空间里面的变量没有生命周期,也就是空间里的变量是全局变量,在main函数中是可以改变空间中变量的值的。

默认访问变量的顺序

我们在前面c中学过在main函数中的访问元素时,遵循局部优先,比如我定义了一个全局变量a并初始化为10,但是我在main函数中有进行了重新赋值为20,那么我打印的a的值就是20;局部要优于全局.
那么再加上命名空间这种域呢?
在c++中,我们访问元素的顺序仍然是局部大于全局,即使是有了命名空间,也不会主动访问该空间

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

就像这样我要访问rand这个变量,编译器会先在局部域中寻找,找不到了就去全局域找,如果在全局域中也找不到就会报错,系统是不会主动在命名空间中访问的,因此我们手动进行访问有时是必要的。

命名空间的几种情况

1.不同命名空间中出现相同的命名

举个例子,我们在bit1的命名空间中定义了一个普通变量a,在bit2命名空间中定义了一个普通变量b,然后进行访问,这时候只要指明指那个命名空间就不会发生冲突。代码如下:

#include<stdio.h>
namespace bit1
{int a=10;
}
namespace bit2
{int a = 20;
}
int main()
{printf("%d\n", bit1::a);printf("%d\n", bit2::a);return 0;
}

 命名空间中的元素具有全局变量的性质,但不能将其完全看成全局变量,在不同的域中命名是可以形同的,并不会发生冲突。

2.多个命名相同的命名空间

倘若我定义了多个命名空间,在这些明明空间中有几个变量的命名是相同,那他们会发生冲突吗?
会的。当我们定义了多个相同的名字的命名空间的话,那么这些命名空间编译时就会发生合并,合并成一个共同的域,在同一个域中是不能出现命名相同的元素名称的。但命名空间支持嵌套。

命名空间嵌套

我们未解决上述的问题,可以更改一个空间的名字之外,就是可以使用嵌套,代码如下:

#include<stdio.h>
namespace bit {namespace bit1{int a = 10;}
}namespace bit1{int a = 20;}
int main()
{printf("%d\n", bit::bit1::a);printf("%d\n", bit1::a);return 0;
}

我们可以将其一个空间进行嵌套,这样两个空间就不冲突啦,然后访问时需要进行二次::访问;

命名空间的展开 

命名空间的展开等同与展开头文件(将其内容进行拷贝),而是类似与函数的声明。举个例子,代码如下:

#include<stdio.h>
namespace bit {int rand = 20;int add(int a, int b){return a + b;}
}
int main()
{printf("%d", bit::rand);printf("%d", bit::rand);printf("%d", bit::rand);printf("%d", bit::rand);printf("%d", bit::rand);printf("%d", bit::rand);printf("%d", bit::rand);return 0;
}

当我们需要多次访问空间中的元素时,我们每一次都需要进行bit::这样的访问的方式是很繁琐的,所以c++支持的命名空间的展开,就很好的解决了这类问题(在一个文件中),上代码:

#include<stdio.h>
namespace bit {int rand = 20;int add(int a, int b){return a + b;}
}
using namespace bit;
int main()
{printf("%d", rand);return 0;
}

展开命名空间的格式是using namesapce +名称,在定义好的命名空间的下面进行展开,这样下面的访问的空间中的元素就可以直接访问;但为什么说是在一个文件中好用的?因为我们平时写代码都是只使用一个文件就足够了,在一个文件中我们通常只会定义一个命名空间,所以不会与其他命名空间发生冲突;

展开命名空间的缺点

试想如果我在一个文件中展开了,2个命名空间,一个空间存在该元素另一个不存在还好;但是我要访问的元素在两个空间中都存在,那到底访问的是哪一个呢?这就会发生冲突了。所以在使用时也需要注意使用的情况;

命名空间的指定展开

有时候我们并不需要将整个命名空间全部展开,所以我们可以只对其中的指定的元素进行展开;
代码如下:

#include<stdio.h>
namespace bit {int rand = 20;int add(int a, int b){return a + b;//函数、结构体也是可以的}
}
using bit::rand;
int main()
{printf("%d", rand);printf("%d", bit::add(2, 5));return 0;
}

通过using bit ::rand我们可以对rand进行展开,访问时可以直接访问,但是其他没有指定展开的依旧要使用原来的方式进行访问,当然指定访问的个数并不是唯一的,可以多写几个using bit ::元素,来根据情况使用; 

using namespace std;涉及到C++输入、输出流;请看下篇博客;

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

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

相关文章

C++的并发世界(七)——互斥锁

0.死锁的由来 假设有两个线程T1和T2&#xff0c;它们需要对两个互斥量mtx1和mtx2进行访问。而且需要按照以下顺序获取互斥量的所有权&#xff1a; -T1先获取mte1的所有权,再获取mt2的所有权。 -T2先获取 mtx2的所有权。再铁取 mtx1的所有权。 如果两个线程同时执行&#xff0c…

C++入门语法(命名空间缺省函数函数重载引用内联函数nullptr)

目录 前言 1. 什么是C 2. C关键字 3. 命名空间 3.1 命名空间的定义 3.2 命名空间的使用 4. C输入和输出 5. 缺省函数 5.1 概念 5.2 缺省参数分类 6. 函数重载 6.1 概念 6.2 为何C支持函数重载 7. 引用 7.1 概念 7.2 特性 7.3 常引用 7.4 引用与指针的区别 7…

leetcode594-Longest Harmonious Subsequence

题目 和谐数组是指一个数组里元素的最大值和最小值之间的差别 正好是 1 。 现在&#xff0c;给你一个整数数组 nums &#xff0c;请你在所有可能的子序列中找到最长的和谐子序列的长度。 数组的子序列是一个由数组派生出来的序列&#xff0c;它可以通过删除一些元素或不删除元…

Node.JS多线程PromisePool之promise-pool库实现

什么是Promise Pool Map-like, concurrent promise processing for Node.js. Promise-Pool是一个用于管理并发请求的JavaScript库&#xff0c;它可以限制同时进行的请求数量&#xff0c;以避免过多的请求导致服务器压力过大。使用Promise-Pool可以方便地实现对多个异步操作的并…

pandas用法-详解教程

pandas用法-详解教程 一、生成数据表二、数据表信息查看三、数据表清洗四、数据预处理五、数据提取六、数据筛选七、数据汇总八、数据统计九、数据输出 一、生成数据表 1、首先导入pandas库&#xff0c;一般都会用到numpy库&#xff0c;所以我们先导入备用&#xff1a; impor…

Vue3 项目实例(二)vite.config.ts的配置与axios安装

一、vite.config.ts的配置 1、对相对路径的处理&#xff08;&#xff09; import { defineConfig } from vite import vue from vitejs/plugin-vue // vite 提供node核心对象path import path from path // https://vitejs.dev/config/ export default defineConfig({plugins…

内网安全之域内用户名枚举

域内用户名枚举可以在无域内有效凭据的情况下&#xff0c;枚举出域内存在的用户名&#xff0c;进而对域内存在的用户名进行密码喷洒攻击&#xff0c;以此来过的域内有效凭据 在Kerberos协议认证的AS-REQ阶段&#xff0c;请求包cname对应的值是用户名&#xff0c;当用户名存在、…

阿里云对象存储OSS的使用笔记

官方地址&#xff1a; https://www.alibabacloud.com/help/zh/oss/developer-reference/manage-directories-3 0 初始化bucket 旧版本OSS import oss2#endpoint https://oss-cn-shanghai-internal.aliyuncs.com # Suppose that your bucket is in the Hangzhou region. end…

计算机网络 实验指导 实验12

路由信息协议&#xff08;RIP&#xff09;实验 1.实验拓扑图 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1…

分布式深度学习库BigDL简述

BigDL简述 BigDL是一个在Apache Spark上构建的分布式深度学习库,由英特尔开发并开源。它允许用户使用Scala或Python语言在大规模数据集上进行深度学习模型的训练和推理。BigDL提供了许多常见的深度学习模型和算法的实现,包括卷积神经网络(CNN)、循环神经网络(RNN)等。由于…

Linux——进程管理

1.gcc与g区别(补充了解) 比如有两个文件:main.c,mainc.cpp(分别用C语言和C语言写的)如果要用gcc编译呢? gcc -o mainc main.c gcc -o mainc mainc.cpp -lstdc 指明用c的标准库; 区别一: gcc默认只链接C库,并不会链接C的库;g会默认链接c标准库. 区别二: gcc编译.c文件,则按照C语…

网易雷火 暑期实习提前批一面(48min)

做题&#xff08;20min&#xff09; 问答&#xff1a;&#xff08;28min&#xff09; 熟悉哪些排序&#xff08;快排、归并&#xff09; C中的map和unordered_map的区别&#xff0c;哪个内存占用更大 C多态 struct会触发GC吗&#xff1f;class呢&#xff1f; MVC设计模式…

NLP 在搜索引擎优化上做的工作

自然语言处理&#xff08;NLP&#xff09;在搜索引擎优化上的工作主要集中在提升搜索结果的相关性和准确性&#xff0c;以及改善用户的搜索体验。以下是NLP在搜索引擎优化中所做工作的详细介绍&#xff1a; 1. 理解用户查询意图【4】 NLP技术可以帮助搜索引擎更好地理解用户的…

设计模式:生活中的观察者模式

想象你在社交媒体上关注&#xff08;订阅&#xff09;了一个名人或新闻频道&#xff08;主题&#xff09;。一旦他们发布新内容&#xff0c;所有关注者&#xff08;观察者&#xff09;都会收到通知。这个过程就很像观察者模式的工作原理。 生活场景类比 主题&#xff08;Subj…

Unity和Android的交互

Unity和Android的交互 一、前言二、Android导出jar/aar包到Unity2.1 版本说明2.2 拷贝Unity的classes.jar给Android工程2.2.1 classes.jar的位置2.2.2 Android Studio创建module2.2.3 拷贝classes.jar 到 Android工程并启用 2.3 编写Android工程代码2.3.1 创建 MainActivity2.…

开源 _ 新一代Android 性能监控框架Rabbit

最终扫描结果会展示如下: 点击右上角导出按钮可以把扫描结果以json的形式导出到SD卡中。 网络日志监控 rabbit可以记录网络请求日志并方便的查看返回的json数据: 卡顿日志监控 rabbit通过Choreographer来检测主线程的运行情况,并异步采集主线程堆栈来还原卡顿现场。 对于下…

自动驾驶汽车关键技术_感知

自动驾驶汽车关键技术|感知 附赠自动驾驶学习资料和量产经验&#xff1a;链接 两套标准 分别由美国交通部下属的国家高速路安全管理局(NationalHighwayTraffic Safety Administration &#xff0c;NHSTA) 和国际汽车工程师协会&#xff08;Societyof Automotive Engineers&am…

C++进阶--C++11(2)

C11第一篇 C11是C编程语言的一个版本&#xff0c;于2011年发布。C11引入了许多新特性&#xff0c;为C语言提供了更强大和更现代化的编程能力。 可变参数模板 在C11中&#xff0c;可变参数模板可以定义接受任意数量和类型参数的函数模板或类模板。它可以表示0到任意个数&…

golang 结构体比较

1.如果结构体成员包含 map, slice, 不可比较 2.int string 普通类型&#xff0c;如果变量顺序不一样&#xff0c;则不可比较 package mainimport "fmt"func main() {s1 : struct {//a map[int]int// a []inta stringb int}{}s2 : struct {//a map[int]int// a []int…

Python+Django+Html河道垃圾识别网页系统

程序示例精选 PythonDjangoHtml河道垃圾识别网页系统 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonDjangoHtml河道垃圾识别网页系统》编写代码&#xff0c;代码整洁&#xff0c;规…