初识C++ (五)

没事干就学习

auto关键字 

auto是C++程序设计语言的关键字。自C++11以来,auto关键字用于两种情况:声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。C++98标准中auto关键字用于自动变量的声明,但由于使用极少且多余,在C++11中已删除这一用法。

c语言之前的用法

在很久很久之前 c语言中auto的用法是这样子的

在前面加上一个auto 就表示让这个a变成一个局部变量 使用完毕之后就自动销毁

但是呢 我们在使用完毕的时候 它会自动销毁 所以说也没必要加上auto关键字多此一举

所以说 auto关键字也就被慢慢废弃了

直到c++中 新的标准赋予了它新的用法

C++中的新用法

在c++中 auto关键字被赋予了一种新用法

auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期推导而得。

 光说没有用 给大家敲几段代码演示下

int a = 10;auto b = a;char c = 'a';auto d = c;

那么这个猜猜看 b的类型是什么呢?

d的类型又是什么呢?

(这里介绍下打印类型的函数 )

typeid(name).name();

我们这个时候可以发现 a b 类型一致 c d类型一致

这也就能基本说明auto的用法了吧

auto使用细则

auto与指针和引用结合起来使用 用auto声明指针类型时 用auto和auto*没有任何区别 但用auto声明引用类型时则必须加&

还是一样 我们来看代码

int main()
{int a = 10;auto b = &a;auto* c = &a;auto& d = a;cout << typeid(b).name() << endl;cout << typeid(c).name() << endl;cout << typeid(d).name() << endl;return 0;
}

接下来我们来看看它们三个分别是什么类型 

 

指针和int

这也就很好的解释了我上面的这句话

auto与指针和引用结合起来使用 用auto声明指针类型时 用auto和auto*没有任何区别 但用auto声明引用类型时则必须加&

当在同一行定义多个变量时 些变量必须是相同的类型 否则编译器将会报错 因为编译器实际只对第一个类型进行推导 然后用推导出来的类型定义其他变量

int a = 10, b = 20;auto c = 10, d = 20;

这样的代码就是没问题的 编译器可以运行通过 

 

 但是我们改成这样子

是不是就直接报错了 

auto不能使用的场景

这里老师讲解的时候说的是两个场景 我个人以为是三个 如果说我的理解有什么误区欢迎大佬们在评论区

指正

1. 未初始化时候

这个很好理解 和引用一样 你不给我一个其他量我怎么进行推导呢?

2. 做参数的时候

这里也很明显的报错了 内容也很明确 我们不能用来做参数

3. auto不能用来定义数组

比如说我们写出以下代码

这里就给出了很明确的报错 auto类型不能出现在数组中

auto的使用场景 

1. 变量的类型很复杂的时候

比如说以下代码

#include <string>
#include <map>
int main()
{std::map<std::string, std::string> m{ { "bule", "蓝色" }, { "red","红色" }};std::map<std::string, std::string>::iterator it = m.begin();while (it != m.end()){//....}return 0;
}

我们这里如果不想要写这么复杂的话只需要使用一下auto关键字就可以 

#include <string>
#include <map>
int main()
{std::map<std::string, std::string> m{ { "bule", "蓝色" }, { "red","红色" }};auto it = m.begin();while (it != m.end()){//....}return 0;
}

这两段代码实现的功能是一模一样的 怎么样 是不是很方便

2. 语法糖:遍历数组

在c语言中我们想要遍历一个数组是不是必须要用下标找出每个元素 然后打印啊

但是呢在c++中引入了一种新的方式

我们将这种方式称为语法糖(使用起来很方便 跟吃糖一样)

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };for (auto x : arr){cout << x << ' ';}
}

这个的原理是什么呢?

其实就是将arr里面的值一个个赋值给x 之后打印出来

那么如果我们想要这么修改数组里面的值 这样可行嘛

很显然是不可以的

因为都说了是赋值嘛

那么这时候聪明的同学肯定就想到了两种解法了对不对

一种是引用 一种是指针

我们来看看引用可以不可以

是可以的 思路没有错

那么指针可不可以呢?

还记得我之前说过的一句话嘛?

其实就是将arr里面的值一个个赋值给x 之后打印出来

指针是不是要指向一个地址啊 所以说要取地址才可以 赋值当然不行啦

3. for遍历的限制条件

注意 如果使用的函数传参数组的话这里就不能使用for遍历了

为什么了呢?

数组传参传的是什么啊?

是不是首元素地址啊

只是把地址传

递进去的话 编译器怎么会知道遍历的范围呢?

所以说会报错

nullptr指针(c++11标准中的空指针)

在良好的C/C++编程习惯中,声明一个变量时最好给该变量一个合适的初始值,否则可能会出现不可预料的错误,比如未初始化的指针。如果一个指针没有合法的指向,我们基本都是按照如下 方式对其进行初始化:

 比如说这样子的代码

两行代码都是定义空指针

但是呢 在c语言中的空指针会遇到一些错误

就像这样子

应该是第一个匹配第一个,第二个匹配第二个

所以说在c++中引入了一个这样一个标准

我相信 通过这几个例子大家应该能够充分理解为什么引入nullptr了

所以说在我们以后的编程中 尽量使用nullptr而不使用NULL了

 总结

本文简单介绍了auto关键字 和nullptr指针
由于博主的水平有限所以难免博客中会出现纰漏 希望大佬们看到之后可以即使指正

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

shell脚本判断nginx安装和运行

shell脚本判断nginx安装和运行 脚本内容&#xff1a; 传入服务名称&#xff1a; read -p "请输入要判断的程序名称:" service_name 查看服务进程&#xff1a; countps -aux | grep -cw $service_name 判断nginx是否安装&#xff08;系统中是否有nginx命令&#xff…

电脑msvcr100.dll丢失的解决方法,详细介绍多个解决方法

由于系统中关键文件msvcr100.dll的缺失&#xff0c;用户可能会遭遇一系列始料未及的困扰与问题。msvcr100.dll是Microsoft Visual C运行库中的一个核心动态链接库文件&#xff0c;对于许多应用程序的正常运行至关重要。当这个特定的dll文件丢失时&#xff0c;可能会导致部分软件…

Windows安装vcpkg教程(VS2022)

内容摘要&#xff1a; 本文详细介绍如何在Windows系统上使用 Git 克隆 vcpkg 仓库来安装vcpkg工具&#xff0c;并链接Visual Studio 2022。 目录 一、关于vcpkg 二、开发环境 三、安装Git 四、使用 Git 克隆 vcpkg 仓库 一、关于vcpkg vcpkg 是一个开源的 C 包管理工具&am…

TypeScript泛型基础知识

1.1 泛型 泛型是可以在保证类型安全的前提下&#xff0c;让函数等与多种类型一起工作&#xff0c;从而实现复用&#xff0c;常用于&#xff1a;函数、接口、class中。 需求&#xff1a;创建一个id函数&#xff0c;传入什么数据就返回该数据本身&#xff08;也就是说&#xff0c…

多线程的安全问题

什么是线程安全问题&#xff1f; 多个线程&#xff0c;访问同一资源&#xff0c;出现了问题&#xff0c;就是线程安全问题&#xff08;数据不准确&#xff0c;或者直接报错&#xff09; 1&#xff09;错误演示&#xff1a; public class Demo04 {static int tickedNum 100;/…

推荐一套相片复原工具:Focus Magic

Focus Magic是一套相片复原工具&#xff0c;能够帮助你修补及强化那些模糊不清楚的影像。其他那些锐利化工具只能够修补那些只有一点模糊的相片&#xff0c;但有了Focus Magic你就可以把那些根本完全没对准焦距的相片重新对准焦距。程序还可以以插件的形式作为其他图形处理工具…

C++:类的继承

在C中&#xff0c;类的继承是一种面向对象编程&#xff08;OOP&#xff09;的重要特性&#xff0c;它允许一个类&#xff08;子类或派生类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。通过继承&#xff0c;可以重用现有的代码&#xff0c;减少重…

详细解读Gson 、Jackson 、FastJson 三大json序列化工具

一 gson Google提供的用来java对象和JSON数据之间进行映射的JAVA类库 优缺点 优点&#xff1a;快速、高效&#xff0c; 依赖少只有一个jar包&#xff0c;面向对象&#xff0c;数据传输解析方便 缺点&#xff1a;速度较慢 mvn依赖 <dependency><groupId>com.go…

版块控制---git

引入 设想&#xff0c;当我们写论文时&#xff0c;对第一版不够满意时&#xff0c;想做出修改但是又怕修改时回毁掉整个论文版本&#xff0c;所以我们通常会进行备份&#xff0c;以防止数据被修改后的崩毁&#xff0c;版块控制就是这个合理创建管理备份的过程&#xff0c;而且这…

BLE 蓝牙客户端和服务器连接

蓝牙通信在设计小型智能设备时非常普遍&#xff0c;之前一直没有使用过&#xff0c;最近使用ardunio ESP32 做了一些实验&#xff0c;做了一个收听播客的智能旋钮&#xff08;Smart Knob&#xff09;&#xff0c;它带有一个旋转编码器和两个按键。 本文介绍BLE 服务器Server和W…

图(Graph)的概念和遍历

目录 定义 相关概念 无向图&#xff08;Undirected graphs) 有向图&#xff08;Directed graphs&#xff09; 完全图 稀疏图 稠密图 权&#xff08;Weight&#xff09; 网&#xff08;Network&#xff09; 子图&#xff08;Subgraph&#xff09; 图的顶点与边间关系 …

python成长技能之正则表达式

文章目录 一、认识正则表达式二、使用正则表达式匹配单一字符三、正则表达式之重复出现数量匹配四、使用正则表达式匹配字符集五、正则表达式之边界匹配六、正则表达式之组七、正则表达式之贪婪与非贪婪 一、认识正则表达式 什么是正则表达式 正则表达式&#xff08;英语&…

Unity图形学之RenderQueue

1.指定物体的渲染顺序 Tags { “Queue” “XXXX” } 取值类型&#xff1a; Background&#xff1a; 对应数值为 1000&#xff0c;用于需要被最先渲染的对象&#xff0c;。 Geometry&#xff1a; 对应数值为 2000, 用于不透明的物体。这个是默认的选项&#xff08;如果不指明…

i春秋-破译(凯撒密码+数字替换单词中的字母)

练习平台地址 竞赛中心 题目描述 题目内容 就是破译&#xff01;&#xff01;&#xff01; 解题 观察到最后一段是四个字母加上{xxxxx}的形式&#xff0c;很像flag&#xff0c;我们猜测要破译的主要是这个片段 大括号依然存在&#xff0c;那么可能是通过凯撒密码来加密的&a…

丹摩征文活动|平台评测与使用体验报告

一、基本信息 目标产品 丹摩智算平台www.damodel.com 体验设备 台式机 体验系统/环境 Windows 10/浏览器 体验时间 2024/11 二、产品信息 产品类型&#xff1a;云计算服务提供商 产品定位&#xff1a;提供AI开发和算力GPU租赁服务的平台。它旨在简化AI开发流程&#…

Stable Diffusion核心网络结构——CLIP Text Encoder

&#x1f33a;系列文章推荐&#x1f33a; 扩散模型系列文章正在持续的更新&#xff0c;更新节奏如下&#xff0c;先更新SD模型讲解&#xff0c;再更新相关的微调方法文章&#xff0c;敬请期待&#xff01;&#xff01;&#xff01;&#xff08;本文及其之前的文章均已更新&…

20241118给荣品PRO-RK3566开发板刷Rockchip原厂的buildroot后使用iperf3打流

20241118给荣品PRO-RK3566开发板刷Rockchip原厂的buildroot后使用iperf3打流 2024/11/18 16:38 缘起&#xff0c;使用荣品的DTS。 Y:\RK3566_RK3568_Linux5.10_V1.2.0\device\rockchip\.chips\rk3566_rk3568\rockchip_rk3566_evb2_lp4x_v10_defconfig 1、指定RK_KERNEL_DTS_NAM…

基于java+SpringBoot+Vue的基于web的智慧社区设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

分析一个库 便于以后的使用 WiFiManager.h 2024/11/18

这一段是开启服务器 的 这些都不是重点 重点是那个R_update ,没猜错的话应该是升级的功能 直接索引到定义看看 ,很明显这里是设置了一个 web 访问地址 那就只有换个思路往后查找 handleUpdate 找到这个函数定义 void WiFiManager::handleUpdate() {#ifdef WM_DEBUG_LEVELDEBUG…

学习笔记024——Ubuntu 安装 Redis遇到相关问题

目录 1、更新APT存储库缓存&#xff1a; 2、apt安装Redis&#xff1a; 3、如何查看检查 Redis版本&#xff1a; 4、配置文件相关设置&#xff1a; 5、重启服务&#xff0c;配置生效&#xff1a; 6、查看服务状态&#xff1a; 1、更新APT存储库缓存&#xff1a; sudo apt…