【C++入门】详解(上)

目录

💕1.C++中main函数内部———变量的访问顺序

💕2.命名空间域namespace

💕3.命名空间域(代码示例)(不要跳)

💕4.多个命名空间域的内部重名

💕5.命名空间域的展开

💕6.展开的本质

💕7.输入输出流(IO)

💕8.缺省函数


(最新更新时间——2025.1.9)

魔不魔 正不正 天地自有风九歌

走不走 留不留 死生皆在我心头

💕1.C++中main函数内部———变量的访问顺序

在C++中,main函数内部的变量的访问是有顺序存在的,其顺序分别为(从高到低):->

局部变量——全局变量——命名空间域

具体是什么意思?请看代码:

84314f0e6c6745c68650597d284b15e7.png

在局部变量与全局变量都存在时,main函数会优先访问局部变量,这也叫做局部优先原则


但如果不存在局部变量a=10呢?

f929be3f5e104c8bb242d6ff3034a428.png

当局部变量被去除后,main函数内部还是会遵循访问顺序来访问,但是它访问不到局部变量a,所以它就会去访问全局变量a


ffc585fa930044f3b7f5d43fcfdf8320.png

但这又是什么原因呢?有的人肯定会认为,这是因为rand是一个随机函数,创建rand变量就会与函数重名,但是这种原因是半对的,接着请看下图:->:

382bc71474744a2b8f7a8c169ae0f4f1.png

我把rand放在这里又可以打印出来了,这是为什么?

其实真正的原因是,在全局变量的rand与头文件#include<stdlib.h>是在同一作用域下,(即全局作用域),在同一作用域下的rand函数与rand变量命名重复,所以才会出现第一种报错的情况

关于第二种情况,则是作用域不同导致的,因为rand函数作用在全局作用域,rand变量作用在局部作用域,所以,作用域不同,它们的效果也不同


那么,有没有一种方法,可以解除第一种情况呢?答案是有的,请看一下讲解:->:

💕2.命名空间域 namespace

什么是命名空间域?

在C++中,每一个命名空间域就相当于一个田地,在这个田地中可以有各种东西,如变量,结构体,函数等等,而你可以给这个田地命名,让它变为独一无二的田地(命名作用域),

命名空间域的书写:

namespace 专属名
{//任意
}

我们以第一大点中错误的rand命名为例

3b5982b430884f03ba01b500f5da12ca.png

如图所见,我们创建了命名空间域abc,在执行printf时,会优先在局部变量中找,找不到,再去全局变量,又找不到,最后去命名作用域找


注意:->我们在调用命名作用域时,运用到了 abc:: ,这表示访问命名作用域中的abc,当我们访问除了局部变量时的作用域,都可以这么表示,全局变量同理,如下图:

800760d8fd4d4df0a4cd5c753131398d.png

如图,在我们想用 ::访问全局变量时,需要注意的是::前面是有一位空格的

💕3.命名空间域(代码示例)(不要跳)

 接下来是命名空间域的实际代码举例,包括(函数,结构体),以及命名作用域的嵌套


1.首先是 函数以及结构体 的调用方法

c265bf0005f741788e3ccb419f5db34c.png


2.命名空间域的嵌套

4c4b55228bb546aca53ef15125e8c883.png

💕4.多个命名空间域的内部重名

多个命名空间域可以在各自的内部重名吗?答案是可以的,因为每一个命名空间域都相当于一个菜园子,你的菜园子有变量A,我的菜园子就不能有了吗?那么代码举例如下:

94428861011748f99e3e38ef0fcdca7e.png

如图可见,不同命名空间域的内部是可以重名的,但是每一个命名空间域是不可以重名的,除非使用命名空间域嵌套-给重名的命名空间域分开

💕5.命名空间域的展开

在我们写main函数时,每使用一次命名空间域都要写一次a::,是不是很麻烦,如图:
df7570be585c4e938428194cafe82365.png

有没有一种方法,可以不这么麻烦呢?答案是有的兄弟,有的,像这么强的操作还有9....,

1种方法

那就是展开命名空间域

我们使用

using namespace 空间域名

 来进行展开

0219b0bd39624e1a90b54f8babc103c7.png

如图,我们就不要再使用a::来访问了


但如果我们只想展开其中的一个呢?

代码如下:

2e6c157a6e84415ea4ee0816424386d0.png

using 空间域名::空间域变量

这里就单独展开了空间作用域a中的b,再举一个例子,单独展开空间作用域里的函数或者结构体,先是展开函数,后是展开结构体

68fe2c5449784044a2da8ba073180ec4.png71dd4f7c194d44f98c4dc6d125a226f6.png

💕6.展开的本质

 在C++中,使用using展开的本质是将命名空间域展开到全局作用域中,举例如下:

这是不展开的情况:可以看到没有报错,逻辑也符合我们所讲的,作用于全局作用域

2f50ecbe582947eea0794687302e9391.png


但如果我们展开了呢?

c5fdb4e109ec442f855d08d1fac3be52.png

如图,就会发生错误,因为展开后的空间作用域相当于变为了全局作用域,而变量的访问顺序是局部,全局,空间作用域,展开后的全局作用域中有两个相同名称的函数,那么main函数内部就会不知道调用哪个add函数

💕7.输入输出流(IO)

 在C++中,创建了新的输入和输出,它们的书写方式是:->

#include<iostream>
using namespace std;
int main()
{	int i = 0;int j = 0;cout << 20 << '\n' << 30 << '\n' << endl;//输出20,30   '\n'是换行cin >> i >> j;//输入 i jcout << i << " " << j << endl;//输出 i 空格 j
}
效果如下:
d33183b1dee5430eab8cc9c70b5ccb40.png

接下来是逐步讲解:

1.为什么要用using space std;

答案:->:因为#include<iostream>是一个标准头文件,而这个头文件,其实是一个巨大的空间域 ,因此在使用时,我们需要先展开空间域std,否则就需要写成:

#include<iostream>
int main()
{	int i = 0;int j = 0;std::cout << 20 << '\n' << 30 << '\n' << std::endl;//输出20,30   '\n'是换行std::cin >> i >> j;//输入 i jstd::cout << i << " " << j << std::endl;//输出 i 空格 j
}

2.cout是什么,cin是什么?

cout与cin都是空间域std里面的函数,cout表示输出除去,cin表示输入进来,当然如果各位不想用,printf与scanf也是可以正常使用在C++中的


3.endl是什么?

这里的endl,(注意不是end1,是英文L),endl在C++中表示的就是换行的意思

💕8.缺省函数

什么是缺省函数?

缺省函数是C++中的一种函数,它支持了你在给函数传参时不需要将所有参数都传过去,代码如下->:

aad21cd83db94f6cae885fb8679e97f2.png

我们发现,即使什么都没传过去,也依旧输出了200,而且我们在创建函数时,将形参初始化了

而这种每个函数在接收处都初始化的函数,叫做全省函数


有部分初始化的叫做半缺省函数,如下:

7d9c9a0ff4ff4fe6aa2a18bc6653fff8.png

半缺省函数,需要从右往左缺省,不可以从左往右缺省,因为没有初始化的形参是必须传入值的,如果从左往右缺参,那就意味着我们不得不全部传参一遍

所以半缺省函数是要从右往左缺省的


那有的人问了,诶?那我跳着传不就可以了,但其实这是不可以的,代码如下:

3ccae3c6ff084a419b39e0a5316b2a18.png

答案显而易见,必须顺序传,不能跳跃着传

2a775d9141e049b28a499aa8c5166913.png

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

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

相关文章

Ungoogled Chromium127 编译指南 MacOS篇(八)- 开始编译

1. 引言 完成了所有依赖包的安装后&#xff0c;我们终于来到了最关键的编译阶段。在开始编译之前&#xff0c;有一些重要的配置信息需要了解。本文将指导您完成整个编译过程。 2. 签名相关说明 虽然在我们的测试编译中不需要进行签名操作&#xff0c;但了解官方的签名要求仍…

使用uniapp 微信小程序一些好用的插件分享

总结一下自己在开发中遇见的一问题&#xff0c;通过引入组件可以快速的解决 1.zxz-uni-data-select 下拉框选择器(添加下拉框检索&#xff0c;多选功能&#xff0c;多选搜索功能&#xff0c;自定义 下拉框插件&#xff0c;使用这个的原因是因为 uniui uview 组件库下拉框太…

腾讯云AI代码助手编程挑战赛-有趣的冷知识分享

作品简介 有趣的冷知识这一编程主要用于对于小朋友的探索力的开发&#xff0c;让小朋友在一开始就对学习具有探索精神。在信息化时代下&#xff0c;会主动去学习自己认知以外的知识&#xff0c;同时丰富了眼界&#xff0c;开拓了新的知识。 技术架构 使用python语言的TK库…

使用 SQL 和表格数据进行问答和 RAG(7)—将表格数据(CSV 或 Excel 文件)加载到向量数据库(ChromaDB)中

将表格数据&#xff08;CSV 或 Excel 文件&#xff09;加载到向量数据库&#xff08;ChromaDB&#xff09;中。这里定义的类 PrepareVectorDBFromTabularData&#xff0c;它的主要功能是读取表格数据文件到DataFrame中、生成嵌入向量、并将这些数据存储在向量数据库的集合中&am…

攻防世界 wtf.sh-150

点进去&#xff0c;发现是一个类似于论坛的网站&#xff0c;并且对报错等做了处理 用御剑扫描一下 ​ 发现是php形式的文件&#xff0c;但点进去访问不了。看看wp&#xff0c;发现此题存在路径穿越漏洞&#xff0c;就是&#xff08;如果应用程序使用用户可控制的数据&#xff0…

Vue3组件通讯——自定义事件(子->父)

需求如下&#xff1a; 1.在子组件中&#xff0c;当用户点击提交按钮后&#xff0c;更新数据库 2.数据更新成功后&#xff0c;子组件通知父组件getUserInfo函数&#xff0c;重新获取数据&#xff0c;同步更新 3.子组件等待getUserInfo函数执行完毕后&#xff0c;调用init函数…

mongodb配置文件详解

mongodb 配置文件采用yaml格式&#xff0c;配置文件的选项还是比较多的&#xff0c;下面是一些配置文件解释。 下面提供一份MongoDB副本集在生产环境中的配置 # mongod.conf # # systemLog: systemLog: destination: file logAppend: true path: /data/mongodb/mongodb-vr-2701…

【已解决】如何让容器内的应用程序使用代理?

首先&#xff0c;按照这种配置方法&#xff0c;即通过在 /etc/systemd/system/docker.service.d/http-proxy.conf 中设置代理&#xff0c;它只会影响 Docker 守护进程本身&#xff0c;并不会自动影响 Docker 容器内部的软件或容器中的网络行为。 这意味着&#xff1a; Docker …

2025年:AI化浪潮中的社会变迁与商业革新

随着人工智能(AI)技术的迅猛发展,2025年将成为一个转折点。这一年,AI不仅将深入到日常生活和商业运营的各个角落,还将引发一系列深刻的社会、经济和技术变革。以下是对未来一年可能出现的“AI化”现象的预测与展望。 AI进入主流文化的标志 超级碗广告:在2025年的超级碗上…

Windows 11 上配置VSCode 使用 Git 和 SSH 完整步骤

在 Windows 11 上&#xff0c;通过 VSCode 使用 Git 和 SSH 克隆 GitHub 仓库的完整优化步骤如下&#xff1a; 1. 安装必备工具 下载并安装 Git&#xff1a; 访问 Git 官网 下载最新版本。安装时&#xff0c;选择以下选项&#xff1a; Default editor for Git: Use Visual Stud…

【Spring】Redis缓存+ehcache

文章目录 基于Spring的RedisehcacheRedis 缓存配置Cacheable 注解CacheEvict 注解缓存配置 基于Spring的Redisehcache Redis 缓存配置 在项目中添加 Redis 的依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot…

UE5 打包要点

------------------------- 1、需要环境 win sdk &#xff0c;大约3G VS&#xff0c;大约10G 不安装就无法打包&#xff0c;就是这么简单。 ----------------------- 2、打包设置 编译类型&#xff0c;开发、调试、发行 项目设置-地图和模式&#xff0c;默认地图 项目…

小程序textarea组件键盘弹起会遮挡住输入框

<textarea value"{{remark}}" input"handleInputRemark" ></textarea> 如下会有遮挡&#xff1a; 一行代码搞定 cursor-spacing160 修改后代码 <textarea value"{{remark}}" input"handleInputRemark" cursor-spacin…

用python 进行雷电接口检测

雷电接口检测工具说明文档 功能概述 这个Python脚本用于检测系统的雷电(Thunderbolt)接口支持情况&#xff0c;包括&#xff1a; 检测系统是否有雷电控制器检测Type-C/雷电端口识别雷电接口版本&#xff08;Thunderbolt 1-5&#xff09;显示理论传输速度列出已连接的雷电设备…

卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现

卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现 目录 卷积神经网络 (CNN, Convolutional Neural Network) 算法详解与PyTorch实现1. 卷积神经网络 (CNN) 算法概述1.1 图像处理1.2 CNN的优势2. CNN的核心技术2.1 卷积层2.2 池化层2.3 全连接层2.4 激活…

《深度学习模型在鸿蒙分布式框架下的跨设备高效之旅》

在人工智能领域&#xff0c;深度学习模型的训练与推理通常需要强大的计算资源和大量的数据支持。而鸿蒙系统的分布式框架为解决这一问题提供了新的思路和方法&#xff0c;使得深度学习模型能够在多个设备之间实现高效的训练与推理。 鸿蒙分布式框架概述 鸿蒙系统是一款面向万…

git的rebase和merge的区别?

B分支从A分支拉出 1.git merge 处于A分支执行&#xff0c;git merge B分支:相当于将commit X、commit Y两次提交&#xff0c;作为了新的commit Z提交到了A分支上。能溯源它真正提交的信息。 2.git rebase 处于B分支&#xff0c;执行git rebase A分支&#xff0c;B分支那边复…

Cadence——virtuous生成的symbol其端口自动添加注释

新换的工艺库&#xff0c;环境变量也会发生变化&#xff0c;毕竟每一家PDK下的.cdsinit 和 .cdsenv文件不尽相同。 这次新换的PDK&#xff0c;搭建完Schcematic之后&#xff0c;再生成的Symbol&#xff0c;发现其pin口&#xff0c;也就是端口没有自动生成注释&#xff0c;我就…

Ruby语言的正则表达式

Ruby语言的正则表达式详解 正则表达式&#xff08;Regular Expressions&#xff0c;简称Regex&#xff09;是一种强大的文本处理工具&#xff0c;它可以用来匹配、搜索、替换字符串中的模式。在Ruby语言中&#xff0c;正则表达式的使用非常灵活&#xff0c;并且具有良好的可读…

CClinkIEfield Basic转Modbus TCP网关模块连接三菱FX5U PLC

捷米特JM-CCLKIE-TCP是自主研发的一款CCLINK IE FB从站功能的通讯网关。该产品主要功能是将各种 MODBUS-TCP 设备接入到 CCLINK IE FB网络中。 捷米特JM-CCLKIE-TCP网关连接到CCLINK IE FB总线中做为从站使用&#xff0c;连接到 MODBUS-TCP 总线中做为主站或从站使用。 为了打破…