命名空间的使用大全
概述
在C++中,我们会使用变量、常量、函数、类、对象、结构体等各种元素。随着工程越来越庞大,代表这些元素的标识符冲突的概率也越来越大。为了解决标识符命名冲突的问题,C++标准在1995年引入了关键字namespace,也叫做命名空间。使用命名空间后,标识符会归属于不同的空间,即使重名了,一般情况下也不会发生冲突。
规则
1、命名空间的定义比较简单,将需要放到命名空间内的元素置于"namespace 名称 {"和"}"之间即可。
namespace my_data
{int nData = 22;int Add(int a, int b){return a + b;}
}
2、命名空间只能在全局范围内定义,不能在局部范围内定义。
int main()
{namespace my_data // 编译出错{int nData = 22;}return 0;
}
3、访问命名空间中的元素时,有三种方式:一是添加命名空间名称和作用域限定符,二是使用using namesapce将整个命名空间引入,三是使用using将命名空间中指定的元素引入(后续使用该元素时,就不用再添加命名空间和作用域限定符了)。
namespace my_data
{int nData = 22;
}using namespace my_data;
using my_data::nData;int main()
{printf("%d\n", my_data::nData);return 0;
}
4、命名空间可以是匿名的,此时,命名空间中的元素只能在本文件中访问,外界访问不了,相当于给元素增加了static。
namespace
{int nData = 22;
}int main()
{printf("%d\n", nData);return 0;
}
5、命名空间可以嵌套,也就是在一个命名空间内,再定义另一个命名空间。
namespace my_data
{int nData = 22;namespace my_data2{int nData2 = 66;}
}int main()
{printf("%d, %d\n", my_data::nData, my_data::my_data2::nData2);return 0;
}
6、可以给命名空间取别名,并使用这个别名访问命名空间。
namespace my_data
{int nData = 22;
}namespace my_data_alias = my_data;int main()
{printf("%d\n", my_data_alias::nData);return 0;
}
7、允许存在多个相同名称的命名空间,编译器会自动将其合并到同一个命名空间中。
namespace my_data
{int nData = 22;
}namespace my_data
{int Add(int a, int b){return a + b;}
}
8、命名空间中的函数,其定义可以放在命名空间内部,也可以放在命名空间外部。放在命名空间外部时,函数前面必须加上命名空间名的前缀。
namespace my_data
{int Add(int a, int b);class CBase{public: CBase();};
}int my_data::Add(int a, int b)
{return a + b;
}my_data::CBase::CBase()
{NULL;
}
9、尽量不要在头文件中使用using语句,这相当于引入了命名空间内的元素。其他文件使用时,可能会导致命名冲突。
作用域
1、不使用命名空间时,如果全局变量和局部变量同名,则局部变量将覆盖全局变量。
int nData = 66;int main()
{int nData = 88;printf("%d\n", nData); // 输出:88return 0;
}
在上面的示例代码中,输出的值为88。这是因为,局部变量nData和全局变量nData重名,局部变量自动覆盖了全局变量。如果想强制使用全局变量,则可以使用::nData的写法。可参看下面的示例代码。
int nData = 66;int main()
{int nData = 88;printf("%d\n", ::nData); // 输出:66return 0;
}
2、在全局范围内使用using语句,会在全局范围内引入命名空间中的元素。
namespace my_data
{int nData = 22;
}int nData = 66;using namespace my_data; // 或者 using my_data::nData;int main()
{printf("%d\n", nData); // 编译出错return 0;
}
编译上述的示例代码时,会发生编译错误。这是因为在全局范围内使用using namespace my_data或using my_data::nData时,相当于在全局范围内又声明了一个nData,会与已有的全局变量nData冲突。再来看看下面的示例代码。
namespace my_data
{int nData = 22;
}using namespace my_data; // 或者 using my_data::nData;int main()
{int nData = 66;printf("%d\n", nData); // 输出:66return 0;
}
此时不会有编译错误了,而是正常输出66,因为局部变量nData覆盖了using namespace my_data或using my_data::nData引入的全局变量nData。
3、在局部范围内使用"using 命名空间名::元素"语句,会在当前作用域范围内引入命名空间中指定的元素。
namespace my_data
{int nData = 22;
}int main()
{int nData = 66;if (true){using my_data::nData;printf("%d\n", nData); // 输出:22}return 0;
}
在上面的示例代码中,输出的值为22。这是因为在局部范围内使用using my_data::nData时,相当于在当前作用域if代码块内声明了一个临时变量nData,这个临时变量会覆盖main作用域下的临时变量nData,故最终输出22。再来看看下面的示例代码。
namespace my_data
{int nData = 22;
}int main()
{int nData = 66;using my_data::nData;printf("%d\n", nData); // 编译错误return 0;
}
我们把if代码块去掉了,这次会输出什么值呢?不会输出任何值,编译会发生错误。这是因为,我们在main作用域下使用了using my_data::nData,从而导致与相同作用域下声明的nData重名了。
4、在局部范围内使用"using namespace 命名空间名"语句,会在当前作用域范围下将命名空间中所有的元素引入全局范围。
namespace my_data
{int nData = 22;
}int main()
{if (true){using namespace my_data;}printf("%d\n", nData); // 编译错误return 0;
}
上面的示例代码会发生编译错误,为什么呢?using namespace my_data已经将命名空间中所有的元素引入全局范围了,为什么在main作用域下访问不了nData呢?这是因为,using namespace my_data虽然将所有元素引入了全局范围,但只会在当前作用域范围下生效。再来看看下面的示例代码。
namespace my_data
{int nData = 22;
}int nData = 66;int main()
{if (true){using namespace my_data;printf("%d\n", nData); // 编译错误}return 0;
}
上面的示例代码仍然会发生编译错误,因为using namespace my_data将所有元素包括nData引入了全局范围,这与已经声明的全局变量nData冲突了。继续看下面的示例代码。
namespace my_data
{int nData = 22;
}int main()
{int nData = 66;if (true){using namespace my_data;printf("%d\n", nData); // 输出:66}return 0;
}
在上面的示例代码中,输出的值为66。using namespace my_data将所有元素包括nData引入了全局范围,但main中定义的局部变量nData会覆盖这个引入的同名的全局变量nData。再来看看下面的示例代码。
namespace my_data
{int nData = 22;
}int main()
{int nData = 66;using namespace my_data;printf("%d\n", nData); // 输出:66return 0;
}
我们把if代码块去掉了,仍会输出66。解释同上,这里就不再赘述了。
相关文章:
命名空间的使用大全
概述 在C中,我们会使用变量、常量、函数、类、对象、结构体等各种元素。随着工程越来越庞大,代表这些元素的标识符冲突的概率也越来越大。为了解决标识符命名冲突的问题,C标准在1995年引入了关键字namespace,也叫做命名空间。使用…...
Redisson分布式锁和同步器详解-官方原版
一、锁定基于Redis的Java分布式可重入锁对象,并实现了锁接口。如果获取锁的Redisson实例崩溃,则此类锁可能会在获取状态下永久挂起。为了避免这种Redisson维护锁看门狗,当锁持有者Redisson实例处于活动状态时,它会延长锁的到期时间…...
【C语言进阶】指针与数组、转移表详解
前言 大家好我是程序猿爱打拳,我们在学习完指针的基本概念后知道了指针就是地址,我们可以通过这个地址并对它进行解引用从而改变一些数据。但只学习指针的基础是完全不够的,因此学习完指针的基础后我们可以学习关于指针的进阶,其中…...
SDN是什么,和SD-WAN有什么关系
SDN全称为“软件定义网络”(Software-Defined Networking),是一种新型的网络架构,通过将网络的控制面和数据面分离,将网络控制集中到控制器中进行统一管理和配置,以提高网络的灵活性和可管理性。传统网络的…...
百度前端高频react面试题(持续更新中)
说说你用react有什么坑点? 1. JSX做表达式判断时候,需要强转为boolean类型 如果不使用 !!b 进行强转数据类型,会在页面里面输出 0。 render() {const b 0;return <div>{!!b && <div>这是一段文本</div>}</div…...
中级嵌入式系统设计师2016下半年下午应用设计试题
中级嵌入式系统设计师2016下半年下午试题 试题一 阅读以下说明,回答问题1至问题3。 【说明】 某综合化智能空气净化器设计以微处理器为核心,包含各种传感器和控制器,具有检测环境空气参数(包含温湿度、可燃气体、细颗粒物等),空气净化、加湿、除湿、加热和杀菌等功能…...
【雅思备考】九分学长写作课笔记
原视频:https://www.bilibili.com/video/BV1FG4y1J7br?p13&vd_source552ac2291179cf9d44088ea168db5531 一、综述 共计1小时 小作文: 描述 图表图(数据图)、流程图(示意图)、地图(示意…...
【源码解析】SpringBoot自动装配的实现原理
什么是SpringBoot的自动装配 SpringBoot在启动的时候会扫描外部jar包中的META-INF/spring.factories文件,将文件中配置的类信息按照条件装配到Spring容器中。 实现原理 核心注解SpringBootApplication Target({ElementType.TYPE}) Retention(RetentionPolicy.R…...
详解ROS时间戳
ROS(Robot Operating System)是一个用于机器人开发的开源软件框架,其中涉及到了一些与时间相关的概念和工具,如时间戳、计时器等。本文将主要介绍ROS中时间戳的概念和应用,并提供一个Python代码案例演示如何处理ROS时间…...
Android Window、WindowManager
1.窗口Window 在Android中显示一个界面,首先想到的是Activity、Dialog或Toast。但是在有些情况下,比如悬浮球,用Activity会显然多余,这个时候可以直接使用窗口来实现。 Android中所有的视图都是通过Window来呈现的,不管是Activity、Dialog还是Toast,它们的视图实际上都…...
【一天一门编程语言】怎样设计一门编程语言?
怎样设计一门编程语言? 确定目标 确定语言的用途: 是一门通用编程语言,还是一门专门面向某个特定目标的语言?是一门面向对象的语言,还是一门过程化的语言?将语言的最终用户定义为谁? 确定语言…...
微服务保护 -- 初识 Sentinel(雪崩问题,快速入门Sentinel)
大家好,今天我们要来学习阿里巴巴开源的流量控制和熔断降级框架 – Sentinel 。 1、雪崩问题及解决方案 首选我们来了解一下雪崩问题及其解决方案,我们学习这个微服务保护,其实就是为了去应对类似于雪崩问题这样的服务故障。 1.1 什么是雪…...
软件测试面试问答
笔试 笔试的话我们需要揣测具体会考什么内容,我们可以通过招聘信息去了解该公司需要什么样的技能,以此来准备笔试。一般必考的内容会有编程,测试用例设计,工作流程,逻辑思维等内容,除此之外每个公司可能还会…...
【架构】架构师的核心能力-抽象能力
文章目录一、通过归纳法找共性二、通过演绎法找关系三、通过归纳法找特性四、最后架构的核心是管理复杂度,架构师的核心能力是抽象能力,什么是抽象能力?抽象能力就是一种化繁为简的能力。何为化繁为简?就是把一种复杂的事情变得简…...
前端一面常见react面试题(持续更新中)
React 组件中怎么做事件代理?它的原理是什么? React基于Virtual DOM实现了一个SyntheticEvent层(合成事件层),定义的事件处理器会接收到一个合成事件对象的实例,它符合W3C标准,且与原生的浏览器…...
亥姆霍兹线圈测量系统
亥姆霍兹线圈[Helmholtz线圈]是指由具有相同线圈匝数、相同线圈绕制方式且线圈半径等于线圈间距的一对或者多对线圈构成的线圈组合。 根据线圈的形状,亥姆霍兹线圈可分为圆形亥姆霍兹线圈和方形亥姆霍兹线圈;根据磁场方向,亥姆霍兹线圈可分为…...
JavaScript 类型转换
Number() 转换为数字, String() 转换为字符串, Boolean() 转化为布尔值。JavaScript 数据类型在 JavaScript 中有 5 种不同的数据类型:stringnumberbooleanobjectfunction3 种对象类型:ObjectDateArray2 个不包含任何值的数据类型…...
Spring Batch 综合案例实战-项目准备
目录 案例需求 分析 项目准备 步骤1:新开spring-batch-example 步骤2:导入依赖 步骤3:配置文件 步骤4:建立employee表与employe_temp表 步骤5:建立基本代码体系-domain-mapper-service-controller-mapper.xml …...
STM32CubeMX串口USART中断发送接收数据
本文代码使用 HAL 库。 文章目录前言一、中断控制二、USART中断使用1. 中断优先级设置 :2. 使能中断3. 使能UART的发送、接收中断4. 中断收发函数5. 中断处理函数6. 中断收发回调函数三、串口中断实验串口中断发送数据点亮 led:实验现象:总结…...
JavaScript Web Workers使用流程
背景 Web Workers是一个API,允许在浏览器中运行后台处理任务,而不影响用户界面(UI)线程的稳定性。 Web Workers 可用于消除阻止 UI 的耗时任务,如图表生成,物理模拟或数据分析等: 使用 Web W…...
数据结构与算法(五):优先队列
这节总结一下优先队列的常用实现方法。 一、基本概念 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级…...
二叉树的前序遍历-java两种方式-力扣144
一、题目描述给你二叉树的根节点 root ,返回它节点值的 前序 遍历。示例 1:输入:root [1,null,2,3]输出:[1,2,3]示例 2:输入:root []输出:[]示例 3:输入:root [1]输出…...
浅析 Redis 主从同步与故障转移原理
我们在生产中使用 Redis,如果只部署一个 Redis 实例,当该实例宕机,到恢复之前都不可用;虽说 Redis 一般都用来做缓存,但不可用给业务系统带来的影响也是不小的,流量大时甚至会导致整个服务宕机。所以 Redis…...
MyBatis学习笔记(七) —— 特殊SQL的执行
7、特殊SQL的执行 7.1、模糊查询 模糊查询的三种方式: 方式1:select * from t_user where username like ‘%${mohu}%’ 方式2:select * from t_user where username like concat(‘%’,#{mohu},‘%’) 方式3:select * from t_u…...
计算机组成原理(1)--计算机系统概论
一、计算机系统简介1.计算机系统软硬件概念计算机系统由“硬件”和“软件”两大部分组成。所谓“硬件”,是指计算机的实体部分,它由看得见摸得着的各种电子元器件,各类光、电、机设备的实物组成,如主机、外部设备等。所谓“软件”…...
jdbc模板的基本使用
1.JdbcTemplate的开发步骤 <1>导入spring-jdbc和spring-tx坐标 <2>创建数据库表和实体 <3>创建JdbcTemplate对象 <4>执行数据库 2.JdbcTemplate快速入门 <1>导入坐标 <dependency><groupId>org.springframework</groupId><…...
JPA 注解及主键生成策略使用指南
JPA 注解 Entity 常用注解 参考:JPA & Spring Data JPA学习与使用小记 指定对象与数据库字段映射时注解的位置:如Id、Column等注解指定Entity的字段与数据库字段对应关系时,注解的位置可以在Field(属性)或Prope…...
【C语言刷题】找单身狗、模拟实现atoi
目录 一、找单身狗 1.暴力循环法 2.分组异或法 二、模拟实现atoi 1.atoi函数的功能 2.模拟实现atoi 一、找单身狗 题目描述:给定一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 编写一个函数找出这两个只出现一次的数字。 比如&…...
前端必会面试题指南
计算属性和watch有什么区别?以及它们的运用场景? // 区别computed 计算属性:依赖其它属性值,并且computed的值有缓存,只有它依赖的属性值发生改变,下一次获取computed的值时才会重新计算computed的值。watch 侦听器:…...
C 语言—— 数组
【C 语言】数组1. 概念2. 声明3. 分类4. 初始化5. 赋值6. 附加语法7. VLA 的一些补充1. 概念 数组是存放一组 相同类型 的 有序 数据的一段 连续 空间。 2. 声明 TYPE identifier[static(optional) qualifiers(optional) expression(optional)] TYPE identifier[qualifiers(o…...
临沂网站建设公司全国/惠州网站seo
有的时候,大家可能会遇到这种需求:显示某个物体的线框,就像汽车设计图纸(CAD之类的)那样。例如下面这种效果: 效果1: 效果2: 用shader就可以解决这个问题。甚至可以不写代码&#x…...
wordpress插件怎么使用/广州seo和网络推广
本文简单介绍下linux中比较常用的命令以及用法。su : 切换用户用法 : su [用户名]举例 #:su Su1userad : 添加用户,使用后一般会跟着passwd用法: useradd [选项] 用户名举例 #:useradd Su1passwd: 添加密码或者修改密码用法: pa…...
html代码规范/aso优化平台
目录1.对调数问题..............................................................................................-1 -2.数平方和运算问题...................................................................................-1 -3.打印5阶幻方........................…...
网站怎么做看起来好看/百度认证怎么认证
转载于:https://www.cnblogs.com/freenovo/archive/2011/06/25/4469872.html...
做果蔬零售的网站/深圳全网推广托管
1viewdidLoad在什么时候调用:viewDidLoad在代码运行到[self.view addSubview : x.view]时调用。...
建设网站的相关费用/百度打广告收费表
dd单链据结构定义 typedef struct LNode {int data;struct LNode *next; }LNode,*LinkList; 单链表的初始化 void InitList(LinkList&L) {Lnew LNode;;L->nextNULL; } 单链表的插入 1.把结点插入链表最后一位,如果想插入特定位置只需要改变while条件 v…...