【C++入门】一篇搞懂auto关键字

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】
在这里插入图片描述

目录

  • 作用不那么大的场景
  • auto真正的价值
  • auto和指针结合使用
  • 注意点
  • auto不能推导的场景
  • 范围for
    • 范围for的使用条件

作用不那么大的场景

在C++中推出了关键字auto,其最大的价值就是自动推导
举一个例子:

int a = 10;
int b = 20;
auto c = a;
auto d = 10 + 1.2;

这里的变量c的类型就是int类型。(auto关键字会根据右边的表达式自动推导变量c的类型)。
同理auto关键字根据右边的表达式10 + 1.2来自动推导出变量d的类型为double

我们可以打印出变量c和变量d的类型来看一下验证一下
在这里插入图片描述
上面这个场景的话,其实关键字auto并没有显示多大的作用,我们还不如干脆直接定义intdouble类型就好了。

auto真正的价值

在这里插入图片描述
上面的代码中的vector<int>::iterator it = v.begin();auto it = v.begin();是等价的,用auto关键字的话就会很方便,可以直接把类型很长的内容直接推导出来。

其实,还有更长的类型,在某些项目的场景下,std是不允许进行展开的,请看:

std::map<std::string, std::string> dict;
std::map<std::string, std::string>::iterator dit = dict.begin();
//std::map<std::string, std::string>::iterator是一个类型
//我们直接用auto来进行推导,即定价于下面这种写法
auto dit = dict.begin();

上面这段代码的话用auto就会极大的提高我们的效率,的确是非常方便,也可以一定程度上减少我们的出错的可能性。

auto和指针结合使用

指针和auto是可以结合起来使用的。当我们使用auto来声明指针类型是,用autoauto*其实是没有任何区别的,但是要注意一点就是auto声明引用类型时必须加上&

using namespace std;
int main()
{
	int a = 10;

	auto x = &a;
	auto* y = &a;//指定y必须是指针
	auto& z = a;

	cout << typeid(x).name() << endl;
	cout << typeid(y).name() << endl;
	cout << typeid(z).name() << endl;

	*x = 1000;
	*y = 2000;
	z = 10000;
	return 0;
}

在这里插入图片描述

注意点

第一点:

注意:auto关键字的使用要有一个推导,不能直接进行定义,请看:

在这里插入图片描述
上面这种写法是错误的,这个点一定要注意。

第二点:

当我们在同一行中声明多个变量时,这些变量必须时相同的类型,否则编译器就会报错,因为编译器只对第一个类型进行推导然后推导出来的类型定义其他变量

请看举例:
在这里插入图片描述
在这里插入图片描述

auto不能推导的场景

1.auto不能作为函数的参数
比如:

int Add(auto a,auto b);

这里的话就会编译失败,因为编译器无法对a的实际类型进行推导。
2.auto不能直接用来声明数组
举个例子:
在这里插入图片描述
这是一个错误样例,auto不能直接用来声明数组。

3.为了避免于C++98中的auto发生混淆,C++11只保留了auto作为类型指示符的用法。

范围for

auto在实际中最常见的又是用法就是C++11提出的新式的for循环,还有lambda表达式等进行配合使用。

比如说,我们来举一个auto与C++11提出的新式的for循环来进行配合使用,请看:

//范围for
#include<iostream>
using namespace std;
int main()
{
	int a[] = { 1,2,3,4,5,6,7,8,9,10 };
	for (auto e : a)
	{
		cout << e << " ";
	}
	return 0;
}

另外,只要是数组都可以,这里会依次取数组中的数据赋值给e(e这只是一个名字,当然也可以用a或者b又或者是c都可以),自动迭代,自动判断结束。

刚刚是读取数组中的内容,现在我们来修改数组中的内容能不能行呢?请看:

在这里插入图片描述
这里发现并没有改变数组中的内容,我们要知道,这里会依次读取数组中的内容并赋值给e,而e的改变并不会影响数组中的内容。

那应该怎么办呢?
别忘了,我们可以利用引用俩该改变数组中的内容,请看:
在这里插入图片描述

我们能不能把这里的auto改为int类型呢,答案是肯定的,当然可以了,请看:
在这里插入图片描述
只不过推荐使用auto,因为这样的话不管数组是什么类型的,auto都可以进行推导,减少我们出错的可能性。

范围for的使用条件

1.for循环迭代的范围必须是确定的
对于数组而言,就是数组第一个元素到最后一个元素的范围,对于类而言,应该提供beginend的方法,begin和end就是for循环迭代的范围
还有一点需要我们注意,请看下面代码:

void TestFor(int arr[])
{
	for (auto& e : arr)
	{
		cout << e << endl;
	}
}

上述代码是错误的,因为这里for循环的范围是不确定的,同时arr并不是数组,而是一个指针(因为数组传参了之后就是指针),这里的arr是一个数组名,代表了首元素的地址。

在这里插入图片描述
2.迭代的对象要实现++和==的操作。
好了,以上就是本文的主要讲解内容,主要是C++中的关键字auto。讲解了auto有价值有意义的几个使用场景,同时也介绍了auto的使用规则等等。
就到这里吧,再见啦各位!!!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海尔牵头IEEE P2786国际标准通过Sponsor投票并连任工作组主席

01 海尔牵头IEEE P2786国际标准 通过Sponsor投票 并连任工作组主席 海尔牵头制定的全球首个服装物联网国际标准IEEE P2786《Standard for General Requirements and Interoperability for Internet of Clothing》通过Sponsor投票&#xff0c;标志着该国际标准草案得到了行业…

2.6 浮点运算方法和浮点运算器

学习目标&#xff1a; 以下是一些具体的学习目标&#xff1a; 理解浮点数的基本概念和表示方法&#xff0c;包括符号位、指数和尾数。学习浮点数的运算规则和舍入规则&#xff0c;包括加、减、乘、除、开方等。了解浮点数的常见问题和误差&#xff0c;例如舍入误差、溢出、下…

FPGA实现10G万兆网UDP通信 10G Ethernet Subsystem替代网络PHY芯片 提供工程源码和技术支持

目录 1、前言2、我这里已有的UDP方案3、详细设计方案传统 FPGA UDP 方案本 FPGA 10G UDP 方案(牛逼)10G Ethernet 框图10G Ethernet 发送解析10G Ethernet 接收解析10G Ethernet 寄存器配置10G Ethernet UI 配置 4、vivado工程详解5、上板调试验证并演示ping功能测试数据收发测…

一款支持全文检索、工作流审批、知识图谱的企事业知识库

一、项目介绍 一款全源码&#xff0c;可二开&#xff0c;可基于云部署、私有部署的企业级知识库云平台&#xff0c;一款让企业知识变为实打实的数字财富的系统&#xff0c;应用在需要进行文档整理、分类、归集、检索、分析的场景。 获取方式q:262086839 为什么建立知识库平台&…

perf record对C++程序耗时进行分析

本节将介绍如何使用perf工具的perf record对C代码进行性能分析&#xff0c;一切操作都是在ubuntu 20下进行。 perf工具安装 由于perf工具和内核版本有关&#xff0c;因此直接安装容易出错&#xff0c;建议直接通过如下指令安装&#xff1a; sudo apt-get install linux-tool…

00后卷王的自述,我难道真的很卷?

前言 前段时间去面试了一个公司&#xff0c;成功拿到了offer&#xff0c;薪资也从12k涨到了18k&#xff0c;对于工作都还没两年的我来说&#xff0c;还是比较满意的&#xff0c;毕竟一些工作3、4年的可能还没我高。 我可能就是大家说的卷王&#xff0c;感觉自己年轻&#xff…

独立IP服务器和共享IP服务器有什么区别

在选择一个合适的服务器时&#xff0c;最常见的选择是共享IP服务器和独立IP服务器。尽管两者看起来很相似&#xff0c;但它们有着很大的不同。本文将详细介绍共享IP服务器和独立IP服务器的不同之处&#xff0c;以及如何选择适合您需求的服务器。 一、什么是共享IP服务器? 共享…

Python探索性P图,四种增强方式快速玩转pillow库

嗨害大家好鸭&#xff01;我是爱摸鱼的芝士❤ 我们平时使用一些图像处理软件时&#xff0c; 经常会看到其对图像的亮度、对比度、色度或者锐度进行调整。 你是不是觉得这种技术的底层实现很高大上&#xff1f; 其实最基础的实现原理&#xff0c; 用 Python 实现只需要几行…

Java JDK下载安装环境变量配置

目录 一、下载安装 1.简介 2.JDK下载JDK 官网海外历史地址&#xff1a; 3.安装 二、环境变量配置 1.新建JAVA_HOME变量 2.PATH变量 3.CLASSPATH 变量 4.测试是否安装成功 一、下载安装 1.简介 JDK 是SUN公司提供的一套Java 语言的软件开发工具包&#xff0c;简称JDK(JavaDevelo…

如何编写高质量代码

如何编写高质量代码 1. 前言2. 明确业务场景和用户需求3. 编程实践技巧3.1 提高命名规范3.2 保持代码简洁3.3 好的注释 4. 软件测试5. 总结 1. 前言 现代软件开发中&#xff0c;代码是构建高质量软件的核心。高质量代码能够提高软件系统的可靠性、可维护性和可扩展性&#xff…

给失业的互联网人一个思路:别再苦苦找工作了,要去找门槛低、现金流好、天花板低、资本看不上的创业项目,一年也能几百万!...

失业大潮中的互联网人该何去何从&#xff1f;这大概是许多人在难捱的深夜反复思考的问题。 一位失业很久的网友就在痛苦思索中悟出了适合自己的道路&#xff0c;下面分享给大家&#xff0c;篇幅太长&#xff0c;小编给大家划一下重点。 先说结论&#xff1a;失业的互联网人别再…

浅谈软件测试工程师的技能树

软件测试工程师是一个历史很悠久的职位&#xff0c;可以说从有软件开发这个行业以来&#xff0c;就开始有了软件测试工程师的角色。随着时代的发展&#xff0c;软件测试工程师的角色和职责也在悄然发生着变化&#xff0c;从一开始单纯的在瀑布式开发流程中担任测试阶段的执行者…

优思学院:什么是快速改善方法(Kaizen Blitz)?

什么是快速改善方法&#xff08;Kaizen Blitz&#xff09;&#xff1f; Kaizen blitz是精益管理中的一种方法&#xff0c;指通过集中一段时间内的团队努力来实现快速改进的方法。 Kaizen是一个日语词汇&#xff0c;意为“改善”&#xff0c;是一种广泛应用于企业管理的哲学&a…

明确自动化测试目的

明确自动化测试目的 1.提高测试人员的工作成就感和幸福感&#xff0c;减少手工测试中重复性的工作 目前&#xff0c;在大部分中小企业中&#xff0c;手工测试在日常测试工作占据的比例很大。测试人员必须跟随开发团队不断地进行选代式开发和测试。一个功能模块可能在整个测试周…

SEO机制算是让我玩明白了

获取当前时间时间戳&#xff0c;返回遵循ISO 8601扩展格式的日期 new Date(Date.now()).toISOString() 使用moment库转换回来 this.moment(new Date(Date.now()).toISOString()).format("YYYY-MM-DD") js去掉富文本中html标签和图片 filterHtmlTag(val) {if(!val){…

vue性能优化之虚拟列表滚动

一、前言 前端的性能瓶颈那就是页面的卡顿&#xff0c;当然这种页面的卡顿包含了多种原因。 例如HTTP请求过多导致数据加载变慢&#xff0c;下载的静态文件非常大导致页面加载时间很长&#xff0c;js中一些算法响应的时间过长等。很多前端工程师都花费很多的精力在dom渲染上来…

Docker概念|容器|镜像|命令详细(创建,删除,修改,添加)

Docker概念|容器|镜像|命令详细&#xff08;创建&#xff0c;删除&#xff0c;修改&#xff0c;添加&#xff09; 一&#xff0c;Docker简介二&#xff0c;Docker与虚拟机的区别三&#xff0c;容器核心技术四&#xff0c;Docker核心概念五 docker的安装5.1关闭防火墙,关闭文件防…

python毕业设计之django+vue.js幼儿园网站系统

开发语言&#xff1a;Python 框架&#xff1a;django Python版本&#xff1a;python3.7.7 数据库&#xff1a;mysql 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm 采用了Windows10操作系统平台&#xff0c;使用HTMLCSSJS前端模板django作为后台监控&#xff0…

【VM服务管家】VM4.x算子SDK开发_3.2 公用工具类

目录 3.2.1 图像载入&#xff1a;本地图像的载入方法3.2.2 相机取流&#xff1a;相机SDK取流的方法3.2.3 输入图像&#xff1a;给算子模块输入图像数据的方法3.2.4 实时取流&#xff1a;实时取流的实现方法3.2.5 卡尺ROI&#xff1a;卡尺型ROI的生成方法3.2.6 DL算子耗时&#…

ref在Vue2、Vue3中的使用

文章目录 前言一、ref在Vue2中的用法二、ref在Vue3中的用法 前言 记录一下ref在Vue2与Vue3中的使用&#xff0c;ref可以获取DOM元素&#xff0c;也可以获取子组件的数据、方法。 一、ref在Vue2中的用法 给元素绑定一个ref&#xff0c;然后在js中通过this.$refs获取DOM。 ref命…