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

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从入门到实战&#xff08;二&#xff09;C命名空间 前言一、C的第一个程序二、命名空间&#xff08;一&#xff09;为什么需要命名空间&#xff08;二&#xff09;定义命名空间&#xff08;三&#xff09;使用命名空间1.通过命名空间限定符&#xff1a;2.使用 using 声明&…...

C# OpenCV机器视觉:实现农作物病害检测

在酷热难耐的夏日&#xff0c;阳光似火舌般舔舐大地。阿强惬意地躺在老家院子摇椅上&#xff0c;哼着小曲&#xff0c;手边放着一碗冰镇西瓜&#xff0c;头顶大槐树宛如巨大遮阳伞&#xff0c;洒下斑驳阴凉。他本想趁假期回老家放松&#xff0c;远离城市喧嚣与代码 “纠缠”。 …...

开源软件协议介绍

一、可以闭源使用/不具传染性的协议 允许商业使用和分发 1、BSD&#xff1a;详细介绍 2、LGPL许可证&#xff1a;详细介绍 3、MPL2.0&#xff1a;详细介绍 二、具有传染性/使用后需要开源自身软件的协议 不建议商业使用 1、GPL许可证&#xff1a;详细介绍...

CLion开发Qt桌面

IDE&#xff1a;CLion Qt Qt版本&#xff1a;5.12 学习正点原子的嵌入式Linux开发板时&#xff0c;使用Qt Creator写代码不是很方便&#xff0c;遂尝试使用CLion搭建Qt开发环境。 一、CLion的Qt环境搭建 1&#xff0c;配置工具链 找到Qt的安装目录&#xff0c;此处为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 士的宁&#xff08;strychnine&#xff09; 又名 番木鳖碱 的生物合成 摘要 士的宁&#xff08;番木鳖碱&#xff09;是一种天然产物&#xff0c;通过分离、结构阐明和合成努力&#xff0c;塑造了有机化学领域。目前&#xff0c;士的宁因其强大的…...

【开源免费】基于Vue和SpringBoot的常规应急物资管理系统(附论文)

本文项目编号 T 159 &#xff0c;文末自助获取源码 \color{red}{T159&#xff0c;文末自助获取源码} T159&#xff0c;文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...

(Java版本)基于JAVA的网络通讯系统设计与实现-毕业设计

源码 论文 下载地址&#xff1a; ​​​​c​​​​​​c基于JAVA的网络通讯系统设计与实现(源码系统论文&#xff09;https://download.csdn.net/download/weixin_39682092/90299782https://download.csdn.net/download/weixin_39682092/90299782 第1章 绪论 1.1 课题选择的…...

ray.rllib 入门实践-2:配置算法

前言&#xff1a; ray.rllib的算法配置方式有多种&#xff0c;网上的不同教程各不相同&#xff0c;有的互不兼容&#xff0c;本文汇总罗列了多种算法配置方式&#xff0c;给出推荐&#xff0c;并在最后给出可运行代码。 四种配置方式 方法1 import os from ray.rllib.algori…...

2025-01学习笔记

1.SpEL 第一次知道它的全称 Spring Expression Language&#xff08;SpEL&#xff09; Value("${my.property}") private String myProperty; Value("#{2 * 3}") private int computedValue; 2.逃逸分析 逃逸分析&#xff1a;当一个对象在方法中被定…...

多线程执行大批量数据查询

// 创建一个固定大小的线程池ExecutorService executorService Executors.newFixedThreadPool(5);// 创建多个查询任务List<Callable<List<ShopCompareBase>>> tasks new ArrayList<>();//查询门店 切割,分成十份List<List<String>> sho…...

ChatGPT高效处理图片技巧使用详解

ChatGPT&#xff0c;作为OpenAI开发的预训练语言模型&#xff0c;主要用于生成自然语言文本的任务。然而&#xff0c;通过一些技巧和策略&#xff0c;我们可以将ChatGPT与图像处理模型结合&#xff0c;实现一定程度上的图像优化和处理。本文将详细介绍如何使用ChatGPT高效处理图…...

leetcode——相交链表(java)

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…...

RubyFPV开源代码之系统简介

RubyFPV开源代码之系统简介 1. 源由2. 工程架构3. 特性介绍&#xff08;软件&#xff09;3.1 特性亮点3.2 数字优势3.3 使用功能 4. DEMO推荐&#xff08;硬件&#xff09;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层

仓库地址 在初版代码中&#xff0c;已经实现了基础的增删改查。 但是&#xff0c;逻辑处理都放在Controller层中并没有分为Service层&#xff0c;所以&#xff0c;代码升级时候必须补充上去。 代码结构 升级后的代码结构有所变化。 --common 公共插件 --controller…...

机器学习11-学习路径推荐

机器学习11-学习路径推荐 本文希望摒除AI学习商业宣传要素&#xff0c;推荐一条极简的AI学习路线&#xff01;推荐内容均为在线免费内容&#xff0c;如果有条件可以咨询专业的培训机构&#xff01; 文章目录 机器学习11-学习路径推荐[toc] 1-AI培训路线第一阶段 Python-人工智能…...

[ACTF2020 新生赛]Upload1

题目 以为是前端验证&#xff0c;试了一下PHP传不上去 可以创建一个1.phtml文件。对.phtml文件的解释: 是一个嵌入了PHP脚本的html页面。将以下代码写入该文件中 <script languagephp>eval($_POST[md]);</script><script languagephp>system(cat /flag);&l…...

【PyTorch】0.初识:从吃货角度理解张量

0.初识张量 PyTorch 是一个 Python 深度学习框架&#xff0c;它将数据封装成张量&#xff08;Tensor&#xff09;来进行运算。PyTorch 中的张量就是元素为同一种数据类型的多维矩阵。在 PyTorch 中&#xff0c;张量以 "类" 的形式封装起来&#xff0c;对张量的一些运…...

医学图像分析工具09.1:Brainstorm安装教程

1. 安装前准备 **官方安装包和数据&#xff1a;**https://neuroimage.usc.edu/bst/download.php **官方安装教程&#xff1a;**https://neuroimage.usc.edu/brainstorm/Installation Matlab 版本要求&#xff1a; 有 Matlab&#xff1a; R2009b (7.9) 或更高版本没有 Matlab&…...

InnoDB 事务 undo log 与 MVCC 可视化讲解(画流程图+伪代码)

InnoDB 事务 undo log 与 MVCC 可视化讲解(画流程图+伪代码) 前言 在MySQL的InnoDB存储引擎中,事务的四大特性(ACID)是其核心能力之一。其中,隔离性(Isolation)和一致性(Consistency)的实现离不开undo log与MVCC(多版本并发控制)的精妙设计。 本文将从底层原理出…...

ScintillaNET:提升开发效率的专业代码编辑组件深度解析

ScintillaNET&#xff1a;提升开发效率的专业代码编辑组件深度解析 【免费下载链接】ScintillaNET A Windows Forms control, wrapper, and bindings for the Scintilla text editor. 项目地址: https://gitcode.com/gh_mirrors/sc/ScintillaNET 核心价值定位&#xff1…...

当电力系统遇上MATLAB:手把手玩转SVC设计

基于MATLAB的静止无功补偿系统设计 本设计包括设计报告&#xff0c;仿真工程。 静止无功补偿系统&#xff08;Static Var Compensator&#xff0c;简称SVC&#xff09;是一种用于电力系统中动态调节无功功率的装置&#xff0c;主要由以下几个核心组件构成&#xff1a;晶闸管控制…...

STM32磁悬浮平衡术(一):PID算法调校与硬件选型指南

1. PID算法&#xff1a;磁悬浮系统的"大脑" 磁悬浮系统的核心挑战在于如何让浮子稳定悬浮。想象一下&#xff0c;你要用手指顶着一根铅笔保持直立——这需要不断微调手指的位置来抵消铅笔的倾斜。PID算法就是STM32中扮演这个"微调手指"角色的关键程序。 PI…...

汇编开发与系统构建:FloppyBird操作系统游戏的技术解构

汇编开发与系统构建&#xff1a;FloppyBird操作系统游戏的技术解构 【免费下载链接】floppybird Floppy Bird (OS) 项目地址: https://gitcode.com/gh_mirrors/fl/floppybird 一、价值&#xff1a;当游戏成为操作系统的技术突破 在计算机科学领域&#xff0c;"操作…...

Vue 过滤器详解及 Vue 3 中的替代方案

Vue 过滤器详解及 Vue 3 中的替代方案 一、Vue 过滤器的核心概念与特性 Vue 过滤器&#xff08;Filter&#xff09;是 Vue 2.x 提供的用于数据格式化转换的机制&#xff0c;其核心设计理念是不修改原始数据&#xff0c;仅对显示层进行格式化处理。过滤器本质上是纯函数&#xf…...

LFM2.5-1.2B-Thinking-GGUF入门必看:3步完成低资源GPU部署(含健康检查命令)

LFM2.5-1.2B-Thinking-GGUF入门必看&#xff1a;3步完成低资源GPU部署&#xff08;含健康检查命令&#xff09; 1. 模型简介 LFM2.5-1.2B-Thinking-GGUF是Liquid AI推出的轻量级文本生成模型&#xff0c;专为低资源环境优化设计。这个模型采用GGUF格式&#xff0c;配合llama.…...

MixText+BERT还能这么玩?手把手复现FPMT论文中的‘概率伪混合’黑科技

解密FPMT论文中的概率伪混合&#xff1a;BERT隐藏层的动态插值艺术 在自然语言处理领域&#xff0c;数据增强一直是提升模型泛化能力的关键技术。传统MixText方法通过线性插值在输入层混合样本&#xff0c;但这种"一刀切"的方式忽视了不同样本对模型训练的差异化价值…...

基于国标12190-2021的电磁屏蔽箱多频段测试优化方案

1. 电磁屏蔽箱测试的核心挑战与国标12190-2021的价值 当你第一次接触电磁屏蔽箱测试时&#xff0c;可能会被各种专业术语和复杂的测试流程搞得晕头转向。我刚开始做这行时&#xff0c;最头疼的就是如何确保测试结果既全面又准确——特别是在不同频段下&#xff0c;屏蔽效能差异…...

YOLOE官版镜像案例分享:文本提示检测自定义物体实战

YOLOE官版镜像案例分享&#xff1a;文本提示检测自定义物体实战 1. 引言&#xff1a;开放词汇表检测的挑战与突破 在传统计算机视觉应用中&#xff0c;目标检测模型往往受限于预定义的类别集合。当需要检测训练数据中未出现的新物体时&#xff0c;开发者不得不重新收集数据、…...