初识C++ (五)

news2025/2/24 21:52:00

作者:@小萌新
专栏:@初阶C++
作者简介:大二学生 希望能和大家一起进步
内容简介:本文会简单的介绍auto关键字 还有nullptr关键字
在这里插入图片描述
加油!

初识C++

  • auto关键字
    • c语言之前的用法
    • C++中的新用法
    • auto使用细则
    • auto不能使用的场景
      • 1. 未初始化时候
      • 2. 做参数的时候
      • 3. auto不能用来定义数组
    • auto的使用场景
      • 1. 变量的类型很复杂的时候
      • 2. 语法糖:遍历数组
      • 3. for遍历的限制条件
  • nullptr指针(c++11标准中的空指针)
  • 总结

auto关键字

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

c语言之前的用法

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

在这里插入图片描述

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

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

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

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

C++中的新用法

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

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

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

	// c++新用法 
	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 x = 10;
	auto a = &x;
	auto* b = &x;
	auto& c = x;


	cout << typeid(a).name() << endl;
	cout << typeid(b).name() << endl;
	cout << typeid(c).name() << endl;


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

在这里插入图片描述
指针和int

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

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

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

比如说我们写出以下代码


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

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

在这里插入图片描述

但是我们改成这样子

在这里插入图片描述
是不是就直接报错了

auto不能使用的场景

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

指正

1. 未初始化时候

在这里插入图片描述
这个很好理解 和引用一样 你不给我一个其他量我怎么进行推导呢?

2. 做参数的时候

在这里插入图片描述
这里也很明显的报错了 内容也很明确 我们不能用来做参数

3. auto不能用来定义数组

比如说我们写出以下代码

void TestAuto()
{
	int a[] = { 1,2,3 };
	auto b[3] = { 456 };
}

在这里插入图片描述
这里就给出了很明确的报错 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 arr[] = { 1,2,3,4,5,6,7,8,9 };
	
	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.coloradmin.cn/o/2622.html

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

相关文章

直击固定资产管理痛点,让企业轻松管理海量固定资产

随着固定资产数量和种类、人员、分支机构越来越多&#xff0c;固定资产管理难度加大。传统人工表格管理固定资产的方式在具体实施过程中&#xff0c;会有种种痛点。 1)资产种类繁多&#xff0c;存放地分散且人员变更频繁&#xff0c;管理难度大。 2)盘点费时费力&#xff0c;手…

云原生Kubernetes 基本概念和术语

一、概述 Kubernetes 中的大部分概念如 Node 、 Pod 、 Replication Controller 、 Service 等都可以看作一 种“资源对象”&#xff0c;几乎所有的资源对象都可以通过 Kubernetes 提供的 kubectl 工具&#xff08;或者 API 编程调用&#xff09;执行增、删、改、查等操作并将…

工作中何如来合理分配核心线程数?

文章目录一 回顾1.1 使用线程池的优点1.2 任务类型1.3 IO密集型任务确定线程数1.4 CPU密集型任务确定线程数1.5 混合型任务确定线程数一 回顾 1.1 使用线程池的优点 降低资源消耗&#xff1a;线程是稀缺资源&#xff0c;如果无限制地创建&#xff0c;不仅会消耗系统资源&…

学习笔记-Windows 安全

Windows 安全 注 : 笔记中拓扑图 drawio 源文件在其图片目录下 免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关. 大纲 漏洞利用 LOL RDP 命令行开启RDP多开连接记录凭据窃取绕过组策略限制绕过本地安全策略限制…

手机浏览器怎么下载视频,第三方手机浏览器下载视频的方法

在我们的手机中&#xff0c;总少不了一款手机浏览器。很多人经常使用手机浏览器看视频&#xff0c;那么如何在网页中将喜欢的视频下载下载下来呢&#xff1f;下面给大家讲解UC浏览器、多御安全浏览器、QQ浏览器下载视频的方法&#xff0c;有需要的朋友可以继续往下看。 UC浏览器…

如何写成高性能的代码(三):巧用稀疏矩阵节省内存占用

稀疏矩阵的概念 一个mn的矩阵是一个由m行n列元素排列成的矩形阵列。矩阵里的元素可以是数字、符号及其他的类型的元素。 一般来说&#xff0c;在矩阵中&#xff0c;若数值为0的元素数目远远多于非0元素的数目&#xff0c;并且非0元素分布没有规律时&#xff0c;则称该矩阵为稀…

【数据结构】详解顺序表(图解)

目录一、顺序表的概念1.1、静态顺序表1.2、动态顺序表二、接口实现2.1、开辟一个动态顺序表及初始化2.2、顺序表的增容2.3、顺序表的尾插及尾删2.4、顺序表的头插及头删2.5、顺序表在pos处插入及删除数据2.6、顺序表的销毁及打印2.7、顺序表的查找及修改一、顺序表的概念 顺序表…

【linux/docker】解决ORA-28000: the account is locked

项目场景&#xff1a; oracle11g客户端连接失败 问题描述 java.sql.SQLException: ORA-28000: the account is locked 原因分析&#xff1a; 由于oracle 11g 在默认在default概要文件中设置了密码最大错误次数为10&#xff0c;“FAILED_LOGIN_ATTEMPTS10”&#xff0c;密码错误…

单商户商城系统功能拆解25—营销中心—优惠券

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

NumPy数组基础

一、NumPy数组属性 首先我们先了解一下NumPy 数组属性。NumPy 的数组中比较重要 ndarray 对象属性有&#xff1a; 属性说明ndarray.ndim秩&#xff0c;即轴的数量或维度的数量ndarray.shape数组的维度&#xff0c;对于矩阵&#xff0c;n 行 m 列ndarray.size数组元素的总个数…

Python应用开发——串口通信

Python应用开发——串口通信 目录Python应用开发——串口通信前言1 环境搭建2 硬件准备3 代码编写与测试3.1 简单测一下串口收发3.2 补充细节3.3 完善整个收发流程结束语前言 在嵌入式开发中我们经常会用到串口&#xff0c;串口通信简单&#xff0c;使用起来方便&#xff0c;且…

20:访问者模式

1&#xff1a;定义 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 2&#xff1a;结构 访问者模式包含以下主要角色: 抽象访问者&#xff08;Visitor&#xff09;角色&#xff1a;定义了对每一个元…

Matlab 高光谱遥感数据处理与混合像元分解

教程从基础、方法、实践三方面对高光谱遥感进行讲解。基础篇&#xff0c;站在学员的角度去理解“高光谱”&#xff0c;用大家能听的懂的语言去讲述高光谱的基本概念和理论&#xff0c;帮助学员深入理解这项技术的底层科学机理。方法篇&#xff0c;将高光谱技术与MATLAB工具结合…

Yolov5:强大到你难以想象──新冠疫情下的口罩检测

初识Yolov5是看到一个视频可以检测街道上所有的行人&#xff0c;并实时框选出来。之后学习了CNN卷积神经网络&#xff0c;在完成一个项目需求时&#xff0c;发现卷积神经网络在切割图像方面仍然不太好用。于是我想到了之前看到的Yolov5&#xff0c;实战后不禁感慨一句&#xff…

50天50个前端小项目(纯html+css+js)第十八天(背景轮播图)

今天要做的是一个轮播图&#xff0c;不过是属于全屏类型的轮播图&#xff0c;先来看看效果&#xff1a; 点击左右按钮能切换背景&#xff0c;达到轮播图效果 来看代码实现部分&#xff0c;首先是html: <!DOCTYPE html> <html lang"en"><head>&…

四大含金量高的算法证书考试

证书考试推荐一、PAT 计算机程序设计能力测试二、CCF CSP认证三、团体程序设计天梯赛四、蓝桥杯大赛一、PAT 计算机程序设计能力测试 官网&#xff1a;PAT 计算机程序设计能力测试 PAT为浙江大学出的一款程序设计的测试网站&#xff0c;分为乙级、甲级、顶级三种&#xff0c;…

【MySQL 第十二天 事务的介绍|InnoDB使用事务】

【MySQL 第十二天 事务的介绍|InnoDB使用事务】【1】mysql事物的介绍【2】mysql事务处理的方法【3】mysql是u用InnoDB使用事务生命不息&#xff0c;学习不止 【1】mysql事物的介绍 atomicity 原子性&#xff1a;所有事情是统一的整体&#xff0c;必须一起执行&#xff0c;或者都…

2022 需求工程综合论述题【太原理工大学】

需求工程考题的最后一个模块 —— 综合论述题&#xff0c;只出一道题&#xff0c;30分&#xff0c;马上要考试了&#xff0c;临时抱佛脚其实还是非常管用的 hhh&#xff0c;简答、选择、填空及材料分析题前面博客已更&#xff0c;重点把下面这两个题看明白&#xff0c;仅供参考…

Real-Time Rendering——18.4 Optimization优化

Once a bottleneck has been located, we want to optimize that stage to boost the performance. In this section we present optimization techniques for the application,geometry, rasterization, and pixel processing stages. 一旦找到瓶颈&#xff0c;我们希望优化该…

Nginx 安全漏洞【CVE-2018-16843、CVE-2018-16844】解决办法

CVE-2018-16843和CVE-2018-16844漏洞影响 1.9.5 和 1.15.5 之间的所有 nginx 版本 解决办法&#xff1a;关闭http/2请求处理和MP4流媒体支持&#xff0c;将Nginx 升级至1.22.1 stable 最新版本。 操作步骤&#xff1a; 1、查看当前版本信息及配置参数&#xff1a; sudo /us…