当前位置: 首页 > news >正文

P56 auto类型

这篇文章我们讲解一下有关于C++当中的auto类型,这个也算是C++里面的一个梗了,一大串auto连在一起然后让大家猜这是个什么玩意儿。这个关键字的作用是让C++来自行推断数据的类型究竟是什么,而不需要我们予以告知。这样的话我们就不需要指定具体的返回类型了,听起来是很轻松,但是不要让auto使得我们的代码更加难懂。

举个最简单的例子,我们可以直接用auto来定义变量:

auto a = 4;
auto b = "Cherno";

我们可以看到,两个类型其实不同的变量我们都可以用auto来修饰,如果我们把鼠标放到auto上面,会看到这个变量的真是类型。

那么这个时候问题就来了,这样做会不会使得C++成为一种弱变量类型的语言?是不是变得像python一样,不需要给出变量的类型,反正我所有的变量全都写auto是不是就好了?

这里我们就需要仔细地思考这种做法的好与坏,好处的话比如说我们修改了某一个函数的返回内容,但是我们不希望使用端的API发生改变,那么在使用端我们就可以用auto来承接这个函数的返回值,如下所示:

#include<iostream>
#include<string>

static std::string GetName() {
    return "Cherno";
}

int main() {
    auto str = GetName();
    std::cout << str << std::endl;
    std::cin.get();
}

那么如果我们把GetName的类型改为const char*

static const char* GetName() {
    return "Cherno";
}

这样在main当中我们不需要进行任何修改,就还可以使得代码可以正常运行,这样我们就不需要更改两次代码。

但是如果我们的后续代码是与变量类型相关联的,那么这么修改肯定还是会出错的。这个时候如果不使用auto,反而能让我们提前发现问题并修改出正确的结果。

另外一个经常使用auto的情景时,如果我们有一个非常长的变量类型名,那么使用auto来替代就非常方便了。其中最常见的莫过于vector的迭代器了,我们举一个例子就可以看出这个类型名是有多长:

std::vector<std::string> strings;
strings.push_back("Apple");
strings.push_back("Orange");
for (std::vector<std::string>::iterator it = strings.begin(); it != strings.end(); it++) {

}

我们可以看到,迭代器it的类型名非常长,而且并不是那么有意义,或者说是,并不是非常关键。那么我们就可以直接用auto来替换掉这个长的没边的类型名:

for (auto it = strings.begin(); it != strings.end(); it++)

这样一下子就整洁太多了。但是如果不是这种很长的类型名,在循环的时候最好不要使用auto。

当然如果我们想用其他方式来取代这种很长的类型名也是可以的,比如我们可以使用using关键字或者是typedef关键字来代替,比如如下所示:

using vector_it = std::vector<std::string>::iterator;

或者是

typedef std::vector<std::string>::iterator vector_it;

都可以实现用一个简短的类型名代替复杂类型名的功能。

最后需要注意的是,auto只能替代类型名,auto无法替代const或者是&符号,所以如果想要使用引用需要写明auto&,不然的话也会被当作是copy。而且不止是变量可以使用auto,函数返回类型同样可以使用auto,如果这样可以使得代码更加简单的话。

以上就是本篇文章的全部内容了,希望大家能够喜欢!

相关文章:

  • ThinkPHP:配置Redis并使用
  • Python常用的函数和功能
  • HTML之JavaScript DOM操作元素(1)
  • Day1 初识AndroidAudio
  • 蓝桥杯试题:小明的彩灯(差分 前缀和)
  • 綫性與非綫性泛函分析與應用_1.例題(下)-半母本
  • MySQL 数据库关联查询全解析:一对一、一对多、多对多
  • LeetCode刷题---二分查找---454
  • 程序代码篇---C/C++中的变量存储位置
  • vite 开启 gzip压缩
  • 文章精读篇——用于遥感小样本语义分割的可学习Prompt
  • 14.11 LangChain VectorStore 架构解析:构建高效大模型数据管道的核心技术
  • deepseek 引用本地知识库
  • Python项目源码34:网页内容提取工具1.0(Tkinter+requests+html2text)
  • Git操作整体流程
  • 技术总结汇总
  • 23种设计模式 - 空对象模式
  • 2 20 数据开发面试题汇总
  • Trae+Qt+MSVC环境配置
  • 探索与Cursor协作创建一个完整的前后端分离的项目的最佳实践
  • 阿曼外交部:美伊谈判因故推迟
  • 礼来一季度净利增近三成,明星GLP-1药物替尔泊肽贡献近半收入
  • 中国固体火箭发动机领域杰出专家赵殿礼逝世,享年92岁
  • 微软上财季净利增长18%:云业务增速环比提高,业绩指引高于预期
  • 央行就《关于规范供应链金融业务引导供应链信息服务机构更好服务中小企业融资有关事宜的通知》答问
  • 五一“大车流”来了,今日午后G40沪陕高速开始迎来出沪高峰