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
本章详细解说:namespace 。 namespace: namespace,意为:命名空间,c的关键字(关键字,就是提示:取变量名,函数名时不能与之撞名)。 namespace的价值: 为了解…...
低代码开发平台:效率革命还是质量隐忧?
如何看待“低代码”开发平台的兴起? 近年来,“低代码”开发平台如雨后春笋般涌现,承诺让非专业人士也能快速构建应用程序。这种新兴技术正在挑战传统软件开发模式,引发了IT行业的广泛讨论。低代码平台是提高效率的利器࿰…...
在 Django 表单中传递自定义表单值到视图
在Django中,我们可以通过表单的初始化参数initial来传递自定义的初始值给表单字段。如果我们想要在视图中设置表单的初始值,可以在视图中创建表单的实例时,传递一个字典给initial参数。 1、问题背景 我们遇到了这样一个问题:在使…...
Android之复制文本(TextView)剪贴板
效果图: 功能简单就是点击“复制”,将邀请码复制到 剪贴板中 布局 <androidx.constraintlayout.widget.ConstraintLayoutandroid:id"id/clCode"android:layout_width"dimen/dp_0"android:layout_height"dimen/dp_49"…...
Ubuntu24.04设置国内镜像软件源
参考文章: Ubuntu24.04更换源地址(新版源更换方式) - 陌路寒暄 一、禁用原来的软件源 Ubuntu24.04 的源地址配置文件发生改变,不再使用以前的 sources.list 文件,升级 24.04 之后,该文件内容变成了一行注…...
分布式与微服务详解
1. 单机架构 只有一台机器,这个机器负责所有的工作 (这里假定一个电商网站) 现在大部分公司的产品都是单机架构 。 2. 分布式架构 一台机器的硬件资源是有限的,服务器处理请求是需要占用硬件资源的,如果业务增长&a…...
Vue设置滚动条自动保持到最底端
需求描述:在开发中我们常常会遇到需要让滚动条保持到最底端的需求,比如在开发一个聊天框时,请求接口拿到消息列表数据,展示到前端页面时,需要让滚动条自动滚到最底端,以此来展示最后的聊天记录。同时&#…...
uniapp创建一个新项目并导入uview-plus框架
近年来,随着技术的发展,人们越来越意识到跨平台和统一的重要性。对于同一款应用来说,一般都会有移动端、PC端、甚至小程序端。这是由于设备的不同,我们必须要做很多的客户端来满足不同的用户需求。但是由于硬件设施的不同…...
LabVIEW光电在线测振系统
开发了一种基于LabVIEW软件和光电技术的在线测振系统。该系统利用激光作为调制光源,并通过位置敏感型光电传感器(PSD)进行轴振动的实时检测。其主要特点包括非接触式测量、广泛的测量范围、高灵敏度和快速响应时间,且具备优良的抗…...
分布式光伏电站 转化能源 丰富用电结构
分布式光伏系统是一种利用分散式的可再生能源,在靠近用户端的地方安装光伏发电设施,通过光伏效应将太阳能转化为直流电能,并通过逆变器将其转换为交流电,以供用户使用的系统。以下是对分布式光伏系统的详细阐述: 一、…...
环境配置:如何在IntelliJ IDEA中安装和修改JDK版本配置(以Windows为例)
环境配置:如何在IntelliJ IDEA中安装和修改JDK版本配置(以Windows为例) 为了在Java开发中使用最新的功能和优化,升级和配置JDK版本是必不可少的。本文将详细介绍如何下载、安装、配置最新的JDK版本,并在IntelliJ IDEA…...
Spring AOP 原理——代理模式
目录 一、代理模式 1.1 静态代理 1.2 动态代理 1.2.1 JDK动态代理 1.2.2 CGLIB动态代理 Spring AOP 是基于动态代理来实现AOP的。 一、代理模式 代理模式, 也叫委托模式。该模式是为其他对象提供⼀种代理以控制对这个对象的访问。它的作用就是通过提供一个代理类&#…...
leetcode 234.回文链表
思路:其实就是判断反转链表是不是和原链表一样的问题。 我们可以借助反转链表的思路,首先我们先把链表的全部元素正向存储,然后再把链表进行反转。 之后我们再遍历反转之后的链表结点元素是不是和刚刚存储数组里面的元素一致就可以了。一旦…...
AD中Split Planes 的作用和功能
在 Altium Designer (AD) 中,Split Planes 功能允许你在一个平面层(例如电源层或地层)上分割出多个不同的区域,每个区域可以分配给不同的网络(net)。这对于设计中需要管理多种电源或接地类型的情况下非常有…...
[linux][命令]linux文件操作命令大全
Linux操作系统提供了丰富的文件操作命令,以下是一些常用的文件操作命令列表: 查看文件内容 cat:查看文件内容。less:分页显示文件内容。more:分页显示文件内容,一次显示一屏。head:查看文件的前…...
大语言模型 (LLM) 窥探未来
初始的探索 在NLP领域,早期的模型如 LSTM 和 GRU 在处理序列数据时取得了一定的成功。但随着数据量和复杂性的增加,这些模型开始显得力不从心。 Transformer的诞生 Transformer 模型的提出,它通过自注意力(Self-Attention&…...
WPF DataGrid调试错误总结
最近WPF中使用了DataGrid做了表格,框架版本为472,遇到了不少的问题,因为软件添加了一个退出进程的全局错误捕获,因此不得不解决所有问题,这边总结一下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什么是作业、作业控制?3.2作业号3.3常见作业状态3.4作业的切换 4.守护进程4.1什么是守护进程?4.2如何创建守护进程4.3模拟实现daemon …...
红黑树的插入与删除
文章目录 红黑树概念红黑树的性质: 红黑树的插入操作情况一情况二情况三 小总结红黑树的验证红黑树的删除一.删除单孩子节点1. 删除节点颜色为黑色2. 删除颜色为红色 二. 删除叶子节点1. 删除节点为红色2.删除节点为黑色2.1兄弟节点为黑色,有孩子节点&am…...
多个openclaw之间如何互相通信
OpenClaw 多实例通信主要分同机多 Gateway与跨机远程两类场景,核心是靠端口隔离、共享 workspace 与 sessions_send 实现互通docs.openclaw.ai。下面按场景给出可直接落地的配置与命令。一、同主机多实例(多 Gateway)通信适合强隔离需求&…...
BetterNCM Installer:让网易云音乐插件管理化繁为简的插件管理工具
BetterNCM Installer:让网易云音乐插件管理化繁为简的插件管理工具 【免费下载链接】BetterNCM-Installer 一键安装 Better 系软件 项目地址: https://gitcode.com/gh_mirrors/be/BetterNCM-Installer 你是否曾经因为安装网易云音乐插件的复杂流程而望而却步…...
如何通过系统性抗体研发服务加速创新药物开发?
一、为何现代抗体药物研发需要系统性技术支撑?抗体药物作为生物制药领域的核心组成部分,在肿瘤、自身免疫疾病、神经系统疾病等重大疾病治疗中展现出革命性潜力。然而,从靶点验证到临床候选分子确立的研发过程充满复杂挑战:抗体分…...
新手挖洞实录:我是如何通过一个Vue站点的逻辑缺陷拿到Shell的
从零到一的渗透实战:一位安全新手的Vue站点突破之旅 第一次成功getshell的感觉,就像在黑暗中摸索许久后突然找到开关——那种豁然开朗的兴奋感至今难忘。作为刚踏入安全领域的新人,我决定记录下这段从资产发现到最终突破的完整历程ÿ…...
别再死记硬背了!用‘借位法’5分钟搞定子网划分,网工面试必看
别再死记硬背了!用‘借位法’5分钟搞定子网划分,网工面试必看 刚入行的网络工程师最怕什么?十个人里有九个会说是子网划分。那些密密麻麻的二进制数字、复杂的计算公式,简直像天书一样让人望而生畏。但今天我要告诉你一个秘密&…...
Koikatu HF Patch完整安装指南:5步轻松解锁游戏全部潜力
Koikatu HF Patch完整安装指南:5步轻松解锁游戏全部潜力 【免费下载链接】KK-HF_Patch Automatically translate, uncensor and update Koikatu! and Koikatsu Party! 项目地址: https://gitcode.com/gh_mirrors/kk/KK-HF_Patch 还在为Koikatu游戏体验不完整…...
告别重复劳动:用快马平台生成你的专属工作流自动化agent
今天想和大家分享一个提升工作效率的小技巧——用自动化agent框架处理那些重复又繁琐的工作流程。作为一个经常要组织会议的程序员,我发现自己每天要花大量时间做同样的事情:从聊天记录里提取会议信息、手动创建日历事件、再给参会人发邮件通知。直到发现…...
手机也能跑AI?实测3B以下小模型在安卓/iOS端的部署教程(附性能对比)
手机端AI模型实战:3B以下小模型在安卓/iOS的部署与优化指南 当ChatGPT需要数据中心级算力支撑时,你可能没想到自己的手机也能运行类似技术。本文将带你探索移动端AI部署的完整方案——从Termux环境配置到CoreML模型转换,实测Redmi Note 12 Tu…...
ClearerVoice-Studio语音分离实用技巧:分离后各声道说话人身份标注方法
ClearerVoice-Studio语音分离实用技巧:分离后各声道说话人身份标注方法 你是不是也遇到过这种情况?用语音分离工具把一段多人对话音频分成了几个独立的声道,结果看着一堆命名为“output_1.wav”、“output_2.wav”的文件,完全搞不…...
QGIS里怎么加载NASA的SRTM高程数据?从下载到3D可视化的保姆级教程
QGIS实战:从NASA SRTM高程数据下载到3D地形可视化全流程指南 当你第一次在QGIS中看到那些起伏的山脉、蜿蜒的河谷以三维形式呈现时,那种将地理数据转化为视觉故事的成就感是无与伦比的。NASA的SRTM(航天飞机雷达地形测绘任务)高程…...
