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

C++名称空间

名称空间只是用来对名称进行管理的一种方式,首先要了解一下传统C++名称空间。

1.声明区域:声明区域是指可以在其中声明的区域,例如可以在函数外部声明全局变量(区域为所在的文件),在函数块内声明局部变量(区域为所在的块),其声明区域就为其声明位置。

2.潜在作用域:变量的潜在作用域从声明开始,到其声明区域的结尾结束。但是潜在作用域比声明区域小,因为变量必须定义后才能使用。

然而,变量并不是在潜在作用域就是可见的,它可能被其他嵌套的声明区域隐藏,例如:

int a = 0;
int main(){//同理int a = 1;{//在此声明区域中,则会隐藏其他变量
int a = 2;}return 0;
}

在上面中,每个不同区域的同名变量会隐藏其他的同名变量,变量对于程序的可见性称为作用域。

而现在的名称空间则是C++为了解决名称冲突的问题提供的空间工具。

C++关于全局变量和局部变量的规则定义了一种名称空间层次,每个声明区域都可以声明名称,这些名称独立于其他声明区域中声明的名称。在一个函数中声明的局部变量不会和在另一个函数中声明的局部变量冲突。

新的名称空间)

C++新增这样一种功能,通过定义一种新的声明区域来创建命名的名称空间,这样做是为了提供一个声明名称的区域。一个名称空间中的名称不会和另外一个空间中相同的名称冲突。

namespace Jill {double bucket(double n) {//statments}double fetch;struct Hill {int num;char gendet;};
}namespace Jack {double bucket(double n) {}double fetch;struct Hill{int a; double b;};}

默认情况下,名称空间中声明的名称的链接性是外部的(除非引用了常量).名称空间是开放的,可以把名称添加到已有的名称空间中。

Jack::pail = 12.32;
Jill::pail = 23.32;

通过::(作用域解析运算符)来使用该空间对应的限定名。

未被修饰的名称成为未限定的名称,包含名称空间的名称称为限定名称。

同时可以使用using 声明和using 编译指令来添加名称到声明区域,例如:

//如果在外部使用,则将名称添加到全局声明区域中
using namespace Jill;
int main() {//using声明将特定的名称添加到它所属的声明区域中//通过声明区域,将对应名称添加到对应名称空间中using Jill::bucket;//为Jill中的bucketbucket = 1;return 0;
}

当只使用using声明时,using Jill::bucket只会将Jill空间中的bucket加载到对应的main块中的声明区域中,而如果在全局声明区域声明则可以在整个文件中使用。

当使用using 编译命令时,using namespace Jill会将其空间中所有变量添加到对应声明区域。

使用以上两种方法都可以避免使用::作用域解析运算符来声明变量,而直接使用变量名即可,但是有一种情况下必须使用解析运算符。

//正确,因为都是不同的标识符,内存单元不同
jack::pal = 3;
jill::pal = 1;//错误,会产生二义性,编译器不知道使用哪个
using jack::pal;
using jill::pal;pal = 10; //which one?now have a conflict(用哪个?发生冲突)

同时还需要注意using声明和using编译的不同:

假设名称空间和声明区域定义了相同的名称,如果试图使用using声明将名称空间的名称导入该声明区域,则这两个名称会发生冲突,从而报错.

int foom(){Hill top;   //ERROR
Jill::Hill crest;   //valid
}

如果使用using编译指令将该名称空间的名称导入该声明区域,则局部版本将隐藏名称空间版本.

int foom(){
using namespace Jill;Hill top;
Hill crest; //use local value}

一般来说使用using声明比using编译指令安全,因为它导入指定名称,当与局部名称发生冲突时,编译器将发出警告。,而使用using编译命令如果发生冲突会默认使用局部名称覆盖命名空间名称,不会发出警告。

名称空间支持者希望我们使用using声明的方式去导入名称,而不是使用using编译的方式去导入。

但我们可使用嵌套式名称空间,创建一个包含常用using声明的名称空间。

namspace elements

{

namespace fire

        {

        int flame;

        }

  float water;

}

在该嵌套空间中,flame指的是element::fire::flame。同样,可以使用下面的using编译指令使内部名称可用

using namespace element::fire;

也可以在名称空间中使用using编译指令和using声明。

namespace myth

{

        using Jill::fetch;

        using namespace elements;

        using std::cout;

        using std::endl;

        using std::cin;

}

假设要访问Jill::fetch。由于Jill::fetch位于myth中,因此可以这样访问:

std::cin >> myth:fetch;

也可以使用Jill::fetch;来进行访问。

 

接下来使用using编译命令来用于myth名称空间情况。

using命令是可传递的,若A ->B,B->C,则A->C是可行传递的。

using namespace mythl; == (using namespace myth; using namespace elements;)

同时也可以给名称空间创建别名. 

namespace my_favorite_things{....};

则可用下面语句设置别名

namespace mvft = my_favorite_things;

或者

namespace MEF = myth::elements::fire;

int main(){

        using MEF::flam;

        flam = 2;

}

未命名的名称空间

可以通过省略名称空间的名称来创建未命名的空间。

namespace{

        int ice;

        int bandycoot;

 

名称空间示例

namesp.h文件

#ifndef NAME_SP_
#define NAME_SP_#include<string>namespace pers {//个人名称结构struct Person{std::string fname;std::string lname;};//设置个人名称信息void getPerson(Person&);//查看名称信息void showPerson(const Person&);}namespace debts {//可传递using namespace pers;struct Debt{//名称结构Person name;//金额double amount;};void getDebt(Debt&);void showDebt(const Debt&);double sumDebts(const Debt ar[], int n);}#endif // !NAME_SP_

namesp.cpp文件

#include<iostream>
#include"namesp.h"namespace pers {using std::cout;using std::cin;void getPerson(Person& rp) {cout << "Enter first name: ";cin >> rp.fname;cout << "Enter last name: ";cin >> rp.lname;}void showPerson(const Person& rp) {cout << rp.lname << "," << rp.fname;}
}//债务命名空间
namespace debts {//设置债务情况void getDebt(Debt& rd) {getPerson(rd.name);std::cout << "Enter debt: ";std::cin >> rd.amount;}//显示名称和消费金额void showDebt(const Debt& rd) {showPerson(rd.name);std::cout << ": $" << rd.amount << std::endl;}//计算金额总和double sumDebts(const Debt ar[], int n) {double total = 0;for (int i = 0; i < n; i++){total += ar[i].amount;}return total;}}

 main程序文件

#include<iostream>
#include"namesp.h"
void other(void);
void another(void);
int main() {using debts::Debt;using debts::showDebt;//创建一个债务结构Debt golf = { {"Benny","Goatsniff"},125.2 };//查看对应债务情况showDebt(golf);other();another();return 0;
}void other() {using std::cout;using std::endl;using namespace debts;//动态创建一个Person结构对象Person* dg = new Person{ "Doodles","Glister" };showPerson(*dg);delete dg;cout << endl;//创建一个Debt结构的数组Debt zippy[3];int i;for (i = 0; i < 3; i++)getDebt(zippy[i]);for (i = 0; i < 3; i++)showDebt(zippy[i]);//显示总计债务金额cout << "Total debt: $" << sumDebts(zippy, 3) << endl;return;
}void another() {using pers::Person;Person person = { "Milo","Rightshift" };pers::showPerson(person);std::cout << std::endl;
}

在头文件namesp.h中,定义了两个命名空间,其中pers中定义了一个结构体Person用来存放用户的名和姓。还提供了两个函数原型,用于设置姓名和打印姓名。

另一边使用namesp.cpp实现了命名空间中函数原型的定义,将原型的定义放入其中。

最后在main函数中通过头文件引入对应的命名空间,同时使用using声明和using编译命令将命名空间中的结构体和函数引入,同时使用。

至此我们可以有一个初步对头文件和命名空间的认识了,我们将在头文件中定义命名空间,声明对应空间中的变量信息,同时可以定义函数原型(类似于接口),然后通过同名源文件去实现命名空间中的函数定义,或者定义外部变量,最后在main文件中引入头文件,使用using声明或者using namespace编译命令来使用该命名空间中声明的变量和函数。

相关文章:

C++名称空间

名称空间只是用来对名称进行管理的一种方式&#xff0c;首先要了解一下传统C名称空间。 1.声明区域:声明区域是指可以在其中声明的区域&#xff0c;例如可以在函数外部声明全局变量(区域为所在的文件)&#xff0c;在函数块内声明局部变量(区域为所在的块)&#xff0c;其声明区域…...

Centos7扩容

Centos7扩容 保证虚拟机关机且没有快照的情况下按照下图进行操作&#xff1a; 设置好后开机&#xff0c;查看分区情况&#xff1a; [rootlocalhost ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 17G 12G 5.4G 69% / …...

react中ref的使用(useRef,forwardRef,useImperativeHandle,createRef)

文章目录 一、什么是ref二、在函数式组件中使用ref1. useRef 获取dom2. forwardRef获取子组件的dom3. useImperativeHandle将某些指定的行为暴露给父组件 三、在类组件中使用ref1. createRef2. 回调函数3. 字符串 一、什么是ref 在React中&#xff0c;ref是一个用于访问真实DO…...

正点原子嵌入式linux驱动开发——Linux USB驱动

USB是很常用的接口&#xff0c;目前大多数的设备都是USB接口的&#xff0c;比如鼠标、键盘、USB摄像 头等&#xff0c;在实际开发中也常常遇到USB接口的设备&#xff0c;本章就来学习一下如何使能Linux内核自带的USB驱动。这里不会具体学习USB的驱动开发。 USB接口简介 什么是…...

(四)docker:为mysql和java jar运行环境创建同一网络,容器互联

看了很多资料&#xff0c;说做互联的一个原因是容器内ip不固定&#xff0c;关掉重启后如果有别的容器启动&#xff0c;之前的ip会被占用&#xff0c;所以做互联创建一个网络&#xff0c;让几个容器处于同一个网络&#xff0c;就可以互联还不受关闭再启动ip会改变的影响&#xf…...

【kafka】记一次kafka基于linux的原生命令的使用

环境是linux&#xff0c;4台机器&#xff0c;版本3.6&#xff0c;kafka安装在node 1 2 3 上&#xff0c;zookeeper安装在node2 3 4上。 安装好kafka&#xff0c;进入bin目录&#xff0c;可以看到有很多sh文件&#xff0c;是我们执行命令的基础。 启动kafka&#xff0c;下面的…...

C语言或C++结构体及其变量的创建方式汇总

第一种&#xff1a; struct 结构体类型名{ 任意类型 变量&#xff1b; }; 结构体类型名 *结构体变量new 结构体类型名; #include<bits/stdc.h> using namespace std; struct LNode {int data;struct LNode *next; }; /*void PutElem(LNode *t){while(t->next!NULL){…...

mysql之基础语句

数据库的列类型 int&#xff1a;整型 用于定义整数类型的数据 float&#xff1a;单精度浮点4字节32位 准确表示到小数点后六位 double&#xff1a;双精度浮点8字节64位 char&#xff1a;固定长度的字符类 用于定义字符类型数据&…...

Sentinel 哨兵数据 更新下载地址 2023年11月

1. 欧空局官方下载 2023年11月开始&#xff0c;原来欧空局的下载地址和应用有了变化&#xff0c;现在迁移到以下新地址下载&#xff1a; https://dataspace.copernicus.eu/ 我这边测试需要重新注册用户才能进行登录和使用&#xff0c;界面使用和之前差不多&#xff0c;具体操作…...

动态路由协议OSPF项目部署(二)

1. 静态和动态路由的区别&#xff1b; 2. OSPF协议通信过程与部署&#xff1b; 3. OSPF协议在项目上的应用场景 - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由器转发数据 - 路由器需要一张地图 - 路由表 - 路由表如何构建的&#xff1f; - 依靠手动 或…...

winscp文件增量同步到linux服务器

一&#xff0c;点击同步 场景&#xff1a;在做服务器迁移的时候&#xff0c;文件好几十个G一天也迁移不完&#xff0c;每天还有增量的文件&#xff0c;先全量同步一次&#xff0c;然后再用增量同步&#xff0c;然后你用winscp的同步工具&#xff0c;进增量同步。 将本地文件同…...

足足68个!Python函数合集请收好!

内置函数就是python给你提供的, 拿来直接用的函数&#xff0c;比如print.&#xff0c;input等。 #68个内置函数 # abs()   dict()   help()   min()   setattr() # all()   dir()   hex()   next()   sli…...

vue2.0 打包,nginx部署

1、修改这里为空 否则报错&#xff1a;vue is undefined 2、修改为hash&#xff0c;重点&#xff1a;打包dist文件运行&#xff0c;必须这样 3、安装ngnix&#xff0c;重点&#xff1a;使用node的包&#xff1a;httpserve&#xff0c;失败 4、重点&#xff1a;配置代理转发 前端…...

微服务架构之路1,服务如何拆分?使用微服务的注意事项?

目录 一、前言二、单体服务的弊端三、微服务化四、服务如何拆分&#xff1f;五、使用微服务的注意事项1、服务如何定义2、服务如何发布和订阅3、服务如何监控4、服务如何治理5、故障如何定位 大家好&#xff0c;我是哪吒。 一、前言 微服务已经是Java开发的必备技能&#xff…...

解决Mac电脑音乐显示歌名的乱码问题

最近想听「万能青年旅店」的歌&#xff0c;结果在Mac电脑的「音乐」里面打开后是乱码。 【原因】(求助于chatGPT) 乱码问题可能是由于MP3文件的元数据&#xff08;比如歌曲名、艺术家、专辑等信息&#xff09;的编码问题导致的。如果这些信息是用非标准的或者不兼容的字符编码…...

赢在电商设计!2024年最新电商设计实战技巧盘点

双十一、双十二、黑五的电商大促即将轮番将至&#xff0c;电商运营人迎来大忙季&#xff0c;选品、直播、采购入库、售后……各种环节都是影响电商转化的关键因素&#xff0c;而电商设计作为打通这些环节&#xff0c;打造高转化率电商平台的关键要素&#xff0c;能够吸引用户注…...

约数之和 (普通快速幂求逆元做法)

假设现在有两个自然数 A 和 B&#xff0c;S 是 AB 的所有约数之和。 请你求出 Smod9901 的值是多少。 输入格式 在一行中输入用空格隔开的两个整数 A 和 B 。 输出格式 输出一个整数&#xff0c;代表 Smod9901 的值。 数据范围 0≤A,B≤5107 输入样例&#xff1a; …...

每日一题(LeetCode)----二分查找(三)

每日一题(LeetCode)----二分查找&#xff08;三&#xff09; 1.题目&#xff08;69. x 的平方根 &#xff09; 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 **注意…...

使用 TensorFlow FasterRCNN 网络进行目标检测

目录 描述 此示例的工作原理 处理输入图形 数据准备 sampleUffFasterRCNN 插件 验证输出 TensorRT API 层和操作 TensorRT API 层和操作 先决条件 运行示例 示例 --help 选项 附加资源 许可 变更记录 已知问题 本示例&#xff0c;sampleUffFasterRCNN&#xff0…...

数据结构——顺序表(SeqList)

目录 1. 顺序表介绍 2. 顺序表工程 2.1 顺序表定义 2.1.1 静态顺序表 2.1.2 动态顺序表 2.2顺序表接口 2.2.1 顺序表初始化 2.2.2 顺序表打印 2.2.3 顺序表销毁 2.2.4 顺序表数据插入 2.2.4.1 容量检查 2.2.4.2 顺序表尾插 2.2.4.3 顺序表头插 2.2.4.4 顺序表随机…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

蓝桥杯 冶炼金属

原题目链接 &#x1f527; 冶炼金属转换率推测题解 &#x1f4dc; 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V&#xff0c;是一个正整数&#xff0c;表示每 V V V 个普通金属 O O O 可以冶炼出 …...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景

Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知&#xff0c;帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量&#xff0c;能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度&#xff0c;还为机器人、医疗设备和制造业的智…...