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++名称空间
名称空间只是用来对名称进行管理的一种方式,首先要了解一下传统C名称空间。 1.声明区域:声明区域是指可以在其中声明的区域,例如可以在函数外部声明全局变量(区域为所在的文件),在函数块内声明局部变量(区域为所在的块),其声明区域…...
Centos7扩容
Centos7扩容 保证虚拟机关机且没有快照的情况下按照下图进行操作: 设置好后开机,查看分区情况: [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中,ref是一个用于访问真实DO…...
正点原子嵌入式linux驱动开发——Linux USB驱动
USB是很常用的接口,目前大多数的设备都是USB接口的,比如鼠标、键盘、USB摄像 头等,在实际开发中也常常遇到USB接口的设备,本章就来学习一下如何使能Linux内核自带的USB驱动。这里不会具体学习USB的驱动开发。 USB接口简介 什么是…...
(四)docker:为mysql和java jar运行环境创建同一网络,容器互联
看了很多资料,说做互联的一个原因是容器内ip不固定,关掉重启后如果有别的容器启动,之前的ip会被占用,所以做互联创建一个网络,让几个容器处于同一个网络,就可以互联还不受关闭再启动ip会改变的影响…...
【kafka】记一次kafka基于linux的原生命令的使用
环境是linux,4台机器,版本3.6,kafka安装在node 1 2 3 上,zookeeper安装在node2 3 4上。 安装好kafka,进入bin目录,可以看到有很多sh文件,是我们执行命令的基础。 启动kafka,下面的…...
C语言或C++结构体及其变量的创建方式汇总
第一种: struct 结构体类型名{ 任意类型 变量; }; 结构体类型名 *结构体变量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:整型 用于定义整数类型的数据 float:单精度浮点4字节32位 准确表示到小数点后六位 double:双精度浮点8字节64位 char:固定长度的字符类 用于定义字符类型数据&…...
Sentinel 哨兵数据 更新下载地址 2023年11月
1. 欧空局官方下载 2023年11月开始,原来欧空局的下载地址和应用有了变化,现在迁移到以下新地址下载: https://dataspace.copernicus.eu/ 我这边测试需要重新注册用户才能进行登录和使用,界面使用和之前差不多,具体操作…...
动态路由协议OSPF项目部署(二)
1. 静态和动态路由的区别; 2. OSPF协议通信过程与部署; 3. OSPF协议在项目上的应用场景 - OSPF - 开放式最短路径优先 - 一个动态路由协议 - 路由器转发数据 - 路由器需要一张地图 - 路由表 - 路由表如何构建的? - 依靠手动 或…...
winscp文件增量同步到linux服务器
一,点击同步 场景:在做服务器迁移的时候,文件好几十个G一天也迁移不完,每天还有增量的文件,先全量同步一次,然后再用增量同步,然后你用winscp的同步工具,进增量同步。 将本地文件同…...
足足68个!Python函数合集请收好!
内置函数就是python给你提供的, 拿来直接用的函数,比如print.,input等。 #68个内置函数 # abs() dict() help() min() setattr() # all() dir() hex() next() sli…...
vue2.0 打包,nginx部署
1、修改这里为空 否则报错:vue is undefined 2、修改为hash,重点:打包dist文件运行,必须这样 3、安装ngnix,重点:使用node的包:httpserve,失败 4、重点:配置代理转发 前端…...
微服务架构之路1,服务如何拆分?使用微服务的注意事项?
目录 一、前言二、单体服务的弊端三、微服务化四、服务如何拆分?五、使用微服务的注意事项1、服务如何定义2、服务如何发布和订阅3、服务如何监控4、服务如何治理5、故障如何定位 大家好,我是哪吒。 一、前言 微服务已经是Java开发的必备技能ÿ…...
解决Mac电脑音乐显示歌名的乱码问题
最近想听「万能青年旅店」的歌,结果在Mac电脑的「音乐」里面打开后是乱码。 【原因】(求助于chatGPT) 乱码问题可能是由于MP3文件的元数据(比如歌曲名、艺术家、专辑等信息)的编码问题导致的。如果这些信息是用非标准的或者不兼容的字符编码…...
赢在电商设计!2024年最新电商设计实战技巧盘点
双十一、双十二、黑五的电商大促即将轮番将至,电商运营人迎来大忙季,选品、直播、采购入库、售后……各种环节都是影响电商转化的关键因素,而电商设计作为打通这些环节,打造高转化率电商平台的关键要素,能够吸引用户注…...
约数之和 (普通快速幂求逆元做法)
假设现在有两个自然数 A 和 B,S 是 AB 的所有约数之和。 请你求出 Smod9901 的值是多少。 输入格式 在一行中输入用空格隔开的两个整数 A 和 B 。 输出格式 输出一个整数,代表 Smod9901 的值。 数据范围 0≤A,B≤5107 输入样例: …...
每日一题(LeetCode)----二分查找(三)
每日一题(LeetCode)----二分查找(三) 1.题目(69. x 的平方根 ) 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 **注意…...
使用 TensorFlow FasterRCNN 网络进行目标检测
目录 描述 此示例的工作原理 处理输入图形 数据准备 sampleUffFasterRCNN 插件 验证输出 TensorRT API 层和操作 TensorRT API 层和操作 先决条件 运行示例 示例 --help 选项 附加资源 许可 变更记录 已知问题 本示例,sampleUffFasterRCNN࿰…...
数据结构——顺序表(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 顺序表随机…...
深入Delphi二进制世界:用IDR揭开编译代码的神秘面纱
深入Delphi二进制世界:用IDR揭开编译代码的神秘面纱 【免费下载链接】IDR Interactive Delphi Reconstructor 项目地址: https://gitcode.com/gh_mirrors/id/IDR 你是否曾经面对一个Delphi编译的程序,却无法理解它的内部逻辑?或者需要…...
DB2数据字段拼接实战:从LISTAGG到XMLAGG的进阶应用与避坑指南
1. 从LISTAGG到XMLAGG:DB2字段拼接的进化之路 第一次在DB2里用LISTAGG函数时,那种丝滑的体验让我误以为找到了终极解决方案——直到某天凌晨三点,生产环境突然报警,日志里赫然写着"SQL0407N The result of a scalar fullsel…...
抖音批量下载工具终极指南:免费无水印高效下载完整教程
抖音批量下载工具终极指南:免费无水印高效下载完整教程 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback supp…...
Escrcpy终极指南:简单高效的Android图形化投屏完整方案
Escrcpy终极指南:简单高效的Android图形化投屏完整方案 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 你是否厌倦了复杂的命令行操…...
告别模型水土不服:用TENT的熵最小化,5分钟搞定测试时域自适应(附PyTorch代码)
实战TENT:5行代码解决模型部署中的“水土不服”问题 想象一下这样的场景:你花费数月训练的自动驾驶视觉模型在实验室测试中准确率高达98%,但当它遇到真实世界的暴雨天气时,识别率瞬间暴跌至60%。这种"实验室王者,…...
SM2国密算法实战:从Java工具类到与前端(JS)的跨语言加解密联调避坑指南
SM2国密算法实战:前后端联调中的密钥格式与加解密兼容性解决方案 在前后端分离架构中实现国密SM2算法的端到端加密,就像让两个说不同方言的人进行秘密对话——稍有不慎就会导致"鸡同鸭讲"的尴尬局面。最近在金融项目中使用SM2实现登录报文加密…...
告别mmWaveStudio卡顿:手把手教你用DCA1000EVM CLI命令行录制IWR1642雷达数据
告别mmWaveStudio卡顿:手把手教你用DCA1000EVM CLI命令行录制IWR1642雷达数据 在雷达信号处理领域,数据采集的稳定性和效率直接影响后续算法开发的效果。传统图形界面工具mmWaveStudio虽然功能全面,但在长时间连续采集时容易出现卡顿、崩溃等…...
开发过程中如何利用Taotoken的容灾路由保障服务高可用
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 开发过程中如何利用Taotoken的容灾路由保障服务高可用 在构建依赖大模型API的企业级应用时,服务的持续可用性是核心考量…...
GIS技巧100例23-ArcGIS像元统计实战:从月度栅格到年度气候指标
1. 像元统计基础与气候数据特点 刚接触GIS处理气候数据时,我经常被各种栅格格式和统计方法搞得晕头转向。直到有次用ArcGIS的像元统计工具批量处理了5年的月降水数据,才发现这个功能简直是隐藏的效率神器。像元统计(Cell Statisticsÿ…...
软件工程师视角下的MV与TVA(11)
重磅预告:本专栏将独家连载系列丛书《智能体视觉技术与应用》部分精华内容,该书是世界首套系统阐述“因式智能体”视觉理论与实践的专著,特邀美国 TypeOne 公司首席科学家、斯坦福大学博士 Bohan 担任技术顾问。Bohan先生师从美国三院院士、“…...
