C++入门基础之命名空间|using声明|缺省参数

命名空间

一、命名空间的基本概念

  • 命名空间是 C++ 中的一种机制,用于将相关的标识符(包括函数、类、变量、对象、结构体、枚举等)分组在一起,以避免命名冲突。

  • 它可以看作是一个逻辑容器,将具有相似功能或来自同一模块的元素组织在一个单独的区域内。在不同的命名空间中可以使用相同的标识符而不会产生混淆。

命名空间的使用

假设在一个大型项目里,几个小组分工合作。A 组负责粒子物理模拟相关模块,B 组负责图形渲染相关模块。A 组的小张和 B 组的小李都给自己的代码定义了 quark 这个相同的名字,但他们所指的含义完全不同。

要调用命名空间内的东西需要使用作用域解析运算符::即  作用域::对象 这种形式。

小张在 A 组中定义 quark 可能是用于表示粒子物理中的夸克对象,代码如下:

// A组代码文件,假设为particle_physics.cpp
namespace ParticlePhysics {class Quark {public:void describe() {std::cout << "This is a quark in particle physics." << std::endl;}};
}

 小李在 B 组中定义 quark 也许是用于图形渲染中一种特殊的纹理单元,代码如下:

// B组代码文件,假设为graphics_rendering.cpp
namespace GraphicsRendering {class Quark {public:void render() {std::cout << "Rendering a quark texture unit." << std::endl;}};
}

当项目整合时,如果没有命名空间,就会出现命名冲突,编译器无法区分这两个 quark。但通过命名空间,不同小组的代码可以共存。

例如,在主程序中调用这两个不同含义的 quark

#include <iostream>// 引入A组和B组的相关代码
#include "particle_physics.cpp"
#include "graphics_rendering.cpp"int main() {// 使用ParticlePhysics命名空间中的QuarkParticlePhysics::Quark particleQuark;particleQuark.describe();// 使用GraphicsRendering命名空间中的QuarkGraphicsRendering::Quark graphicQuark;graphicQuark.render();return 0;
}

 

在这个例子中,ParticlePhysics 和 GraphicsRendering 这两个命名空间就像两个不同的 “容器”,分别将小张和小李定义的 quark 隔离开来。通过使用命名空间,在整个项目中,即使不同部分的代码使用了相同的标识符,也不会相互干扰,从而保证了项目代码的完整性和可维护性。

、命名空间之声明

此外,如果只需要频繁使用某个命名空间中的特定元素,也可以使用 using 声明,例如:

#include <iostream>
#include "particle_physics.cpp"
#include "graphics_rendering.cpp"// 只引入ParticlePhysics命名空间中的Quark类
using ParticlePhysics::Quark;int main() {Quark particleQuark;particleQuark.describe();// 对于GraphicsRendering命名空间中的Quark,仍需完整指定命名空间GraphicsRendering::Quark graphicQuark;graphicQuark.render();return 0;
}

这样,在 main 函数中可以直接使用 ParticlePhysics 命名空间中的 Quark,而不会影响到 GraphicsRendering 命名空间中的 Quark(相当于部分引用,将这个特定元素展开在全局,同时也避免了将整个 ParticlePhysics 命名空间引入带来的潜在命名冲突风险。如果使用 using namespace 声明,如 using namespace ParticlePhysics;,则 ParticlePhysics 命名空间中的所有元素都可以直接使用(相当于全部引用,将空间内全部元素展开暴露在全局),在大型项目中可能会增加命名冲突的可能性,所以要谨慎使用,一般也就小程序练练手时图方便使用。 

 四命名空间的嵌套

  • 假设A组(ParticlePhysics)的代码进一步细分,有一个专门研究夸克相互作用的子模块。他们可以在ParticlePhysics命名空间中嵌套一个新的命名空间,比如Interactions。代码如下:
  • // A组代码文件,假设为particle_physics.cpp
    namespace ParticlePhysics {class Quark {public:void describe() {std::cout << "This is a quark in particle physics." << std::endl;}};namespace Interactions {class QuarkInteraction {public:void describeInteraction() {std::cout << "Describing quark - quark interaction." << std::endl;}};}
    }

    调用嵌套命名空间中的元素

  • main函数或者其他需要使用这个嵌套命名空间元素的地方,可以通过多次使用作用域解析运算符来访问。例如:
    int main() {ParticlePhysics::Interactions::QuarkInteraction interaction;interaction.describeInteraction();return 0;
    }

    • 使用using声明和using namespace声明访问嵌套命名空间
      • 可以使用using声明来引入嵌套命名空间中的特定元素,如using ParticlePhysics::Interactions::QuarkInteraction;,这样在当前作用域中就可以直接使用QuarkInteraction类了。
      • 也可以使用using namespace声明,如using namespace ParticlePhysics::Interactions;,这样这个嵌套命名空间中的所有元素都可以在当前作用域中直接使用,但同样要注意命名冲突的问题。
  •  

    通过这些方式,命名空间及其嵌套结构可以很好地组织代码,特别是在大型、复杂的项目中,能够清晰地划分不同模块、不同层次的代码,避免命名冲突,提高代码的可读性和可维护性。

 缺省参数

一、缺省参数的基本概念

  • 缺省参数是 C++ 中函数声明或定义时为参数指定的默认值。当调用函数时,如果没有为这些参数提供相应的值,函数将使用默认值作为参数的值。
  • 这种机制允许函数调用者在不提供所有参数的情况下调用函数,使得函数调用更加灵活和方便。

学习笔记有空再补充

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DevUI 2024 年度运营报告:开源生态的成长足迹与未来蓝图

在当今数字化飞速发展的时代&#xff0c;开源已成为推动技术创新与协作的重要力量。DevUI 作为开源领域的重要一员&#xff0c;其发展历程与成果备受关注。值此之际&#xff0c;GitCode 精心整理了 DevUI 年度运营报告&#xff0c;为您全面呈现 DevUI 社区在过去一年里的开源之…

python中的RPA->playwright自动化录制脚本实战案例笔记

playwright录制功能使用绕过登录操作 1、首先安装playwright pip install playwright2、 安装支持的浏览器 playwright install # 安装支持的浏览器&#xff1a;cr, chromium, ff, firefox, wk 和 webkit3、接着在自己的项目下运行录制命令&#xff1a; playwright codegen…

如何选择适合特定项目需求的人工智能学习框架?

人工智能学习框架&#xff08;AI Learning Framework&#xff09;是一种用于开发、训练和部署人工智能模型的软件平台&#xff0c;旨在简化AI模型的设计、训练和部署过程。这些框架通常提供一系列工具、库和预构建模块&#xff0c;使开发者能够快速实现机器学习任务&#xff0c…

Spring Bug解决

报错&#xff1a; Exception in thread "main" org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type com.itxl.spring6.iocxml.User available: expected single matching bean but found 2: user,user1 at org.sp…

U盘被格式化后的数据救赎与防范策略

一、U盘格式化后的数据困境 在日常的工作与生活中&#xff0c;U盘作为数据传输与存储的重要工具&#xff0c;扮演着不可或缺的角色。然而&#xff0c;当U盘不幸遭遇格式化操作后&#xff0c;存储在其中的宝贵数据瞬间化为乌有&#xff0c;给用户带来极大的困扰。格式化后的U盘…

【AI论文】LlamaV-o1:重新思考大型语言模型(LLMs)中的逐步视觉推理方法

摘要&#xff1a;推理是解决复杂多步骤问题的基本能力&#xff0c;特别是在需要逐步顺序理解的视觉环境中尤为重要。现有的方法缺乏一个全面的视觉推理评估框架&#xff0c;并且不强调逐步解决问题。为此&#xff0c;我们通过三项关键贡献&#xff0c;提出了一个在大型语言模型…

【HTTP】详解

目录 HTTP 基本概念啥是HTTP&#xff0c;有什么用&#xff1f;一次HTTP请求的过程当你在浏览器中输入一个浏览器地址&#xff0c;它会发送什么 &#xff1f;---&#xff08;底层流程&#xff09;HTTP的协议头请求头&#xff08;对应客户端&#xff09;一些请求头请求方法 响应头…

EasyExcel - 行合并策略(二级列表)

&#x1f63c;前言&#xff1a;博主在工作中又遇到了新的excel导出挑战&#xff1a;需要导出多条文章及其下联合作者的信息&#xff0c;简单的来说是一个二级列表的数据结构。 &#x1f575;️‍♂️思路&#xff1a;excel导出实际上是一行一行的记录&#xff0c;再根据条件对其…

第9章:基于Vision Transformer(ViT)网络实现的迁移学习图像分类任务:早期秧苗图像识别

目录 1. ViT 模型 2. 早期秧苗分类 2.1 数据集 2.2 训练 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. ViT 模型 视觉变换器&#xff08;ViT&#xff09;是一种神经网络架构&#xff0c;它将变换器架构的原理应用于视觉数据。最初&#xff0c;Transformers主要用于自然…

ros2-7.5 做一个自动巡检机器人

7.5.1 需求及设计 又到了小鱼老师带着做最佳实践项目了。需求&#xff1a;做一个在各个房间不断巡逻并记录图像的机器人。 到达目标点后首先通过语音播放到达目标点信息&#xff0c; 再通过摄像头拍摄一张图片保存到本地。 7.5.2 编写巡检控制节点 在chapt7_ws/src下新建功…

【React】新建React项目

目录 create-react-app基础运用React核心依赖React 核心思想&#xff1a;数据驱动React 采用 MVC体系package.jsonindex.html好书推荐 官方提供了快速构建React 项目的脚手架&#xff1a; create-react-app &#xff0c;目前使用它安装默认是19版本&#xff0c;我们这里降为18…

Linux手写FrameBuffer任意引脚驱动spi屏幕

一、硬件设备 开发板&#xff1a;香橙派 5Plus&#xff0c;cpu&#xff1a;RK3588&#xff0c;带有 40pin 外接引脚。 屏幕&#xff1a;SPI 协议 0.96 寸 OLED。 二、需求 主要是想给板子增加一个可视化的监视器&#xff0c;并且主页面可调。 平时跑个模型或者服务&#xff0c;…

网络安全构成要素

一、防火墙 组织机构内部的网络与互联网相连时&#xff0c;为了避免域内受到非法访问的威胁&#xff0c;往往会设置防火墙。 使用NAT&#xff08;NAPT&#xff09;的情况下&#xff0c;由于限定了可以从外部访问的地址&#xff0c;因此也能起到防火墙的作用。 二、IDS入侵检…

React Native的现状与未来:从发展到展望

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

数据结构——链表(概念,类型,java实现、增删、优缺点)

我是一个计算机专业研0的学生卡蒙Camel&#x1f42b;&#x1f42b;&#x1f42b;&#xff08;刚保研&#xff09; 记录每天学习过程&#xff08;主要学习Java、python、人工智能&#xff09;&#xff0c;总结知识点&#xff08;内容来自&#xff1a;自我总结网上借鉴&#xff0…

在 macOS 上,用命令行连接 MySQL(/usr/local/mysql/bin/mysql -u root -p)

根据你提供的文件内容&#xff0c;MySQL 的安装路径是 /usr/local/mysql。要直接使用 mysql 命令&#xff0c;你需要找到 mysql 可执行文件的路径。 在 macOS 上&#xff0c;mysql 客户端通常位于 MySQL 安装目录的 bin 子目录中。因此&#xff0c;完整的路径应该是&#xff1…

【QT】: 初识 QWidget 控件 | QWidget 核心属性(API) | qrc 文件

&#x1f525; 目录 1. 控件概述 控件体系的发展阶段 2. QWidget 核心属性 2.1 核心属性概览2.2 用件可用&#xff08;Enabled&#xff09; 2.3 坐标系&#xff08;Geometry&#xff09; **实例 1: 控制按钮的位置**实例 2: 表白 程序 2.4 窗口标题&#xff08;windowTiltle&a…

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…

python爬虫爬取淘宝商品比价||淘宝商品详情API接口

最近在学习北京理工大学的爬虫课程&#xff0c;其中一个实例是讲如何爬取淘宝商品信息&#xff0c;现整理如下&#xff1a; 功能描述&#xff1a;获取淘宝搜索页面的信息&#xff0c;提取其中的商品名称和价格 探讨&#xff1a;淘宝的搜索接口 翻页的处理 技术路线:requests…

【Vim Masterclass 笔记13】第 7 章:Vim 核心操作之——文本对象与宏操作 + S07L28:Vim 文本对象

文章目录 Section 7&#xff1a;Text Objects and MacrosS07L28 Text Objects1 文本对象的含义2 操作文本对象的基本语法3 操作光标所在的整个单词4 删除光标所在的整个句子5 操作光标所在的整个段落6 删除光标所在的中括号内的文本7 删除光标所在的小括号内的文本8 操作尖括号…