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

C++初阶_1:namespace

本章详细解说:namespace 。

namespace:

namespace,意为:命名空间,c++的关键字(关键字,就是提示:取变量名,函数名时不能与之撞名)。

namespace的价值:

为了解决命名冲突。

何为命名冲突?在一个作用域中,变量int 叫 a, 一个函数的名字也叫a。

事实胜于雄辩:

这是一段散发着浓浓C味儿的代码,但是在cpp下同样可以编译。

何故?c++兼容C

#include <stdio.h>
#include <stdlib.h>int rand = 10;
int main()
{return 0;
}

重点是:

我们在main函数外声明一个变量rand,(这种声明在函数外的变量,称为全局变量,全局变量在程序的执行期间都是可以访问的)。而巧合的是,stdlib.h里声明一个函数叫rand(),恰好与rand同名。

这就发生了命名冲突,namespace就是为此类情况而生。 

namespace的定义:

既然namespace创造出来就是为了避免命名冲突,那具体怎么个避免法呢?

  • namespace关键字,后⾯命名空间的名字,然后⼀对{}即可,{}中即为命名空间的成员。命名空间中可以定义变量/函数/类型等。
如:
//各种声明namespace BOB//因为老夫名叫BearOnBasket,便缩写为BOB;各位取名尽可随意
{// 变量int rand = 10;// 函数int Add(int a, int b){return a + b;}//类型struct node{int val;struct node* next;};
}//与typedef不同,这里不能写分号//各种函数...
  • namespace本质是定义出⼀个域,这个域跟全局域各⾃独⽴,不同的域可以定义同名变量。

相当于不同区域里有很多的重名的人,不同区域里可以同时出现许多张三,你要找的:究竟是A市的张三,还是D市的张三...

现在一个rand在BOB这个域里,一个rand()在全局域里,俩rand的存在因不在一个域里而合理化,但要准确地访问到目标rand,又该如何做呢?

::域作用限定符——主打一个访问准确

namespace BOB
{//命名空间中可以定义变量/类型/函数int rand = 10;
}
int main()
{printf("%p\n",rand);//访问stdlib.h里的函数指针printf("%d\n", BOB::rand);// 命名空间名字 :: 变量名 ——保证你访问到目标区域下的目标变量return 0;
}

运行截图: 

再看一段代码:

int a = 1;
int main()
{int a = 100;printf("a = %d\n",a);//猜猜两个a分别是多少printf("a = %d\n",::a);return 0;
}

答案:

a = 100 : 当函数局部域与全局域都有撞名的变量,采用就近原则:离调用变量函数(这里指printf())近的变量优先

a = 1 : 当 :: 前没有命名空间名,默认访问全局域的变量。

再看创建一个命名空间里的类型变量:

namespace BOB
{//命名空间中可以定义变量/类型/函数int rand = 10;struct node{int val;struct node* next;};int Add(int a, int b){return a + b;}
}int main(){//创建一个node类型的结构struct BOB::node newNode;//划重点,struct算关键字,::后接变量名。故是struct BOB::newNode.val = 10;//完成初始化newNode.next = NULL;printf("%d\n",newNode.val);return 0;}
  • namespace只能定义在全局,当然它还可以嵌套定义。

在说明namespace定义时,如果有小伙伴细心的话,会发现:

 

namespace不在任何函数里,同全局变量一样,定义在函数之外。 

嵌套定义——域中域

就像这样:

namespace Bear
{namespace Panda{int a = 12;//定义变量int Add(int x,int y)//函数的定义{return x + y;}}namespace IceBear{int a = 20;int Add(int x, int y){return (x + y )* 10;}}
}

又到了访问环节,既然命名空间定义嵌套,访问自然也要嵌套:

namespace Bear
{namespace Panda{int a = 12;//定义变量int Add(int x,int y)//函数的定义{return x + y;}}namespace IceBear{int a = 20;int Add(int x, int y){return (x + y )* 10;}}
}
int main()
{printf("%d\n",Bear::Panda::a);printf("%d\n",Bear::IceBear::a);printf("%d\n",Bear::Panda::Add(1,2));//不出所料结果应该是3printf("%d\n",Bear::IceBear::Add(1,2));//结果为30return 0;
}

确实不出所料。

  • 项⽬⼯程中多⽂件中定义的同名namespace会认为是⼀个namespace,不会冲突。 

这句,只做理解:

在以后写代码,要想把多个文件合成为一且不影响运行,我们可以使用namespace,同一个命名空间,编译器在编译时逻辑上是合成为一的。 

  • C++标准库都放在⼀个叫std(standard)的命名空间中。 

怎么说?C++的标准库指的就是一些写好的文件包含:类、函数以及类型,它们的外层用一个叫做std的namespace包含。那么,同理,要想访问库里的类,就要使用 std :: 

namespace的使用:

编译查找⼀个变量的声明/定义时,默认只会在局部或者全局查找,不会到命名空间⾥⾯去查找。所以下⾯程序会编译报错。
namespace BOB
{int a = 1;int b = 0;
}int main()
{printf("%d\n",a);return 0;
}

所以我们要使⽤命名空间中定义的变量/函数,有三种⽅式:  

  • 指定命名空间访问,项⽬中推荐这种⽅式。

也就是我们前面所说的  :: 

  • using将命名空间中某个成员展开,项⽬中经常访问的不存在冲突的成员推荐这种⽅式。

确实,经常访问的成员而且不存在冲突,我们总是 ”命名空间名::“ 显得不是很方便。

namespace BOB
{int a = 1;int b = 0;
}
using  BOB::a;//划重点
int main()
{printf("%d\n",a);return 0;
}

如此,就可以成功访问BOB里的a了。

  • 展开命名空间中全部成员,项⽬不推荐,冲突⻛险很⼤,⽇常⼩练习程序为了⽅便推荐使⽤

一旦展开整个命名空间,就相当于全部成员暴露在外;这时候,一旦发生命名冲突就无法隔开。日常写小程序倒鲜少发生,反而方便。但是项目不推荐使用。

namespace BOB
{int a = 1;int b = 0;
}
using namespace BOB;//展开整个命名空间
int main()
{printf("%d\n", a);printf("%d\n", b);return 0;
}

相关文章:

C++初阶_1:namespace

本章详细解说&#xff1a;namespace 。 namespace&#xff1a; namespace,意为&#xff1a;命名空间&#xff0c;c的关键字&#xff08;关键字&#xff0c;就是提示&#xff1a;取变量名&#xff0c;函数名时不能与之撞名&#xff09;。 namespace的价值&#xff1a; 为了解…...

低代码开发平台:效率革命还是质量隐忧?

如何看待“低代码”开发平台的兴起&#xff1f; 近年来&#xff0c;“低代码”开发平台如雨后春笋般涌现&#xff0c;承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式&#xff0c;引发了IT行业的广泛讨论。低代码平台是提高效率的利器&#xff0…...

在 Django 表单中传递自定义表单值到视图

在Django中&#xff0c;我们可以通过表单的初始化参数initial来传递自定义的初始值给表单字段。如果我们想要在视图中设置表单的初始值&#xff0c;可以在视图中创建表单的实例时&#xff0c;传递一个字典给initial参数。 1、问题背景 我们遇到了这样一个问题&#xff1a;在使…...

Android之复制文本(TextView)剪贴板

效果图&#xff1a; 功能简单就是点击“复制”&#xff0c;将邀请码复制到 剪贴板中 布局 <androidx.constraintlayout.widget.ConstraintLayoutandroid:id"id/clCode"android:layout_width"dimen/dp_0"android:layout_height"dimen/dp_49"…...

Ubuntu24.04设置国内镜像软件源

参考文章&#xff1a; Ubuntu24.04更换源地址&#xff08;新版源更换方式&#xff09; - 陌路寒暄 一、禁用原来的软件源 Ubuntu24.04 的源地址配置文件发生改变&#xff0c;不再使用以前的 sources.list 文件&#xff0c;升级 24.04 之后&#xff0c;该文件内容变成了一行注…...

分布式与微服务详解

1. 单机架构 只有一台机器&#xff0c;这个机器负责所有的工作 &#xff08;这里假定一个电商网站&#xff09; 现在大部分公司的产品都是单机架构 。 2. 分布式架构 一台机器的硬件资源是有限的&#xff0c;服务器处理请求是需要占用硬件资源的&#xff0c;如果业务增长&a…...

Vue设置滚动条自动保持到最底端

需求描述&#xff1a;在开发中我们常常会遇到需要让滚动条保持到最底端的需求&#xff0c;比如在开发一个聊天框时&#xff0c;请求接口拿到消息列表数据&#xff0c;展示到前端页面时&#xff0c;需要让滚动条自动滚到最底端&#xff0c;以此来展示最后的聊天记录。同时&#…...

uniapp创建一个新项目并导入uview-plus框架

近年来&#xff0c;随着技术的发展&#xff0c;人们越来越意识到跨平台和统一的重要性。对于同一款应用来说&#xff0c;一般都会有移动端、PC端、甚至小程序端。这是由于设备的不同&#xff0c;我们必须要做很多的客户端来满足不同的用户需求。但是由于硬件设施的不同&#xf…...

LabVIEW光电在线测振系统

开发了一种基于LabVIEW软件和光电技术的在线测振系统。该系统利用激光作为调制光源&#xff0c;并通过位置敏感型光电传感器&#xff08;PSD&#xff09;进行轴振动的实时检测。其主要特点包括非接触式测量、广泛的测量范围、高灵敏度和快速响应时间&#xff0c;且具备优良的抗…...

分布式光伏电站 转化能源 丰富用电结构

分布式光伏系统是一种利用分散式的可再生能源&#xff0c;在靠近用户端的地方安装光伏发电设施&#xff0c;通过光伏效应将太阳能转化为直流电能&#xff0c;并通过逆变器将其转换为交流电&#xff0c;以供用户使用的系统。以下是对分布式光伏系统的详细阐述&#xff1a; 一、…...

环境配置:如何在IntelliJ IDEA中安装和修改JDK版本配置(以Windows为例)

环境配置&#xff1a;如何在IntelliJ IDEA中安装和修改JDK版本配置&#xff08;以Windows为例&#xff09; 为了在Java开发中使用最新的功能和优化&#xff0c;升级和配置JDK版本是必不可少的。本文将详细介绍如何下载、安装、配置最新的JDK版本&#xff0c;并在IntelliJ IDEA…...

Spring AOP 原理——代理模式

目录 一、代理模式 1.1 静态代理 1.2 动态代理 1.2.1 JDK动态代理 1.2.2 CGLIB动态代理 Spring AOP 是基于动态代理来实现AOP的。 一、代理模式 代理模式, 也叫委托模式。该模式是为其他对象提供⼀种代理以控制对这个对象的访问。它的作用就是通过提供一个代理类&#…...

leetcode 234.回文链表

思路&#xff1a;其实就是判断反转链表是不是和原链表一样的问题。 我们可以借助反转链表的思路&#xff0c;首先我们先把链表的全部元素正向存储&#xff0c;然后再把链表进行反转。 之后我们再遍历反转之后的链表结点元素是不是和刚刚存储数组里面的元素一致就可以了。一旦…...

AD中Split Planes 的作用和功能

在 Altium Designer (AD) 中&#xff0c;Split Planes 功能允许你在一个平面层&#xff08;例如电源层或地层&#xff09;上分割出多个不同的区域&#xff0c;每个区域可以分配给不同的网络&#xff08;net&#xff09;。这对于设计中需要管理多种电源或接地类型的情况下非常有…...

[linux][命令]linux文件操作命令大全

Linux操作系统提供了丰富的文件操作命令&#xff0c;以下是一些常用的文件操作命令列表&#xff1a; 查看文件内容 cat&#xff1a;查看文件内容。less&#xff1a;分页显示文件内容。more&#xff1a;分页显示文件内容&#xff0c;一次显示一屏。head&#xff1a;查看文件的前…...

大语言模型 (LLM) 窥探未来

初始的探索 在NLP领域&#xff0c;早期的模型如 LSTM 和 GRU 在处理序列数据时取得了一定的成功。但随着数据量和复杂性的增加&#xff0c;这些模型开始显得力不从心。 Transformer的诞生 Transformer 模型的提出&#xff0c;它通过自注意力&#xff08;Self-Attention&…...

WPF DataGrid调试错误总结

最近WPF中使用了DataGrid做了表格&#xff0c;框架版本为472&#xff0c;遇到了不少的问题&#xff0c;因为软件添加了一个退出进程的全局错误捕获&#xff0c;因此不得不解决所有问题&#xff0c;这边总结一下DataGrid的问题 EditItem is not allowed for this view 按字面意…...

【GCC】结合GPT4 延迟梯度学习1:公式推导及理论分析

大神的分析 本文主要借鉴。【TWCC 】基于gpt和python简化分析webrtc拥塞控制论文: Analysis and Design of the Google Congestion Contro for Web Real-time Communication (WebRTC)感觉应该学习好理论后再进行python 分析:【gcc】基于gpt和python的流程和延迟梯度分析另外:…...

【Linux】【网络】进程间关系与守护进程

进程间关系与守护进程 文章目录 1.进程组1.1什么是进程组1.2组长进程 2.会话2.1什么是会话2.2如何创建会话 3.作业3.1什么是作业、作业控制&#xff1f;3.2作业号3.3常见作业状态3.4作业的切换 4.守护进程4.1什么是守护进程&#xff1f;4.2如何创建守护进程4.3模拟实现daemon …...

红黑树的插入与删除

文章目录 红黑树概念红黑树的性质&#xff1a; 红黑树的插入操作情况一情况二情况三 小总结红黑树的验证红黑树的删除一.删除单孩子节点1. 删除节点颜色为黑色2. 删除颜色为红色 二. 删除叶子节点1. 删除节点为红色2.删除节点为黑色2.1兄弟节点为黑色&#xff0c;有孩子节点&am…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK&#xff0c;开始写第二篇的内容了。这篇博客主要能写一下&#xff1a; 如何给一些三方库按照xmake方式进行封装&#xff0c;供调用如何按…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习

禁止商业或二改转载&#xff0c;仅供自学使用&#xff0c;侵权必究&#xff0c;如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

基于 TAPD 进行项目管理

起因 自己写了个小工具&#xff0c;仓库用的Github。之前在用markdown进行需求管理&#xff0c;现在随着功能的增加&#xff0c;感觉有点难以管理了&#xff0c;所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD&#xff0c;需要提供一个企业名新建一个项目&#…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

rknn toolkit2搭建和推理

安装Miniconda Miniconda - Anaconda Miniconda 选择一个 新的 版本 &#xff0c;不用和RKNN的python版本保持一致 使用 ./xxx.sh进行安装 下面配置一下载源 # 清华大学源&#xff08;最常用&#xff09; conda config --add channels https://mirrors.tuna.tsinghua.edu.cn…...