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…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
