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

news/2024/11/26 13:37:51/

个人主页:平行线也会相交
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【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的使用规则等等。
就到这里吧,再见啦各位!!!

在这里插入图片描述


http://www.ppmy.cn/news/55856.html

相关文章

RSA算法仿真模拟

一.密码学 密码学中常见的加密方式可以分为两类&#xff1a;对称加密和非对称加密。 对称加密&#xff1a;对称加密采用相同的密钥来进行加密和解密。因为加密和解密都使用同样的密钥&#xff0c;所以对称加密速度快、效率高&#xff0c;但在密钥管理方面存在困难。常见的对称…

【论文阅读】CubeSLAM: Monocular 3D Object SLAM

一、基于单目图像的3d目标检测 这一部分是论文中最难理解的一章&#xff0c;作者的主要想法&#xff0c;是利用2d图像来生成3d的目标包围框&#xff08;bounding box&#xff09;&#xff0c;一方面这个思路本身就不是很好懂&#xff0c;另一方面&#xff0c;作者写这一章还是…

async函数学习总结

文章目录 async定义async基本用法async的语法返回Promiseawait语句及错误处理注意点 async 函数的实现原理顶层await总结 async定义 Generator 函数的语法糖对Generator函数的改进&#xff1a; 内置执行器更清晰的语义更广的适用性返回值是Promise 内置执行器&#xff1a;as…

设计模式-门面模式

门面模式 文章目录 门面模式1、什么是门面模式2、为什么要用门面模式2.1、 解决易用性问题2.2、 解决性能问题2.3、 解决分布式事务问题 3、如何使用门面模式4、总结 1、什么是门面模式 门面模式为子系统提供一组统一的接口&#xff0c;定义一组高层接口让子系统更易用。注意这…

digiKam 8.0发布,带来了许多新的功能和改进

导读digiKam 8.0开源、跨平台、免费的专业照片管理软件现在可以下载&#xff0c;这是一个重大更新&#xff0c;带来了许多新的功能和改进。 digiKam 8.0最大的变化是&#xff0c;该软件被移植到最新的Qt 6开源应用框架&#xff0c;以获得更现代和面向未来的体验。然而&#xff…

有重叠的区间和问题

火烧赤壁 题目背景 曹操平定北方以后&#xff0c;公元 208 年&#xff0c;率领大军南下&#xff0c;进攻刘表。他的人马还没有到荆州&#xff0c;刘表已经病死。他的儿子刘琮听到曹军声势浩大&#xff0c;吓破了胆&#xff0c;先派人求降了。 孙权任命周瑜为都督&#xff0c…

jvm之类加载器

写在前面 当我们通过javac命令将java源代码编译为Java字节码后&#xff0c;必须通过类加载器将其加载到jvm中才能运行&#xff0c;所以类加载器是jvm中非常重要的一个组成部分&#xff0c;本文我们就一起来看下吧&#xff01; 1&#xff1a;类的生命周期 类的生命周期如下图…

计算机本科毕业后还需要参加培训吗?我来聊聊java程序员找工作的经验

很多人在学习完计算机专业后&#xff0c;会发现在找到满意的工作时&#xff0c;还需要参加培训班并花费大量的时间和金钱&#xff0c;这让他们倍感不解。为什么在学习了四年的计算机专业之后&#xff0c;还需要参加培训班呢&#xff1f;难道这四年的时间和精力白费了吗&#xf…