作者:守望,Linux应用开发者,目前在公众号【编程珠玑】 分享Linux/C/C++/数据结构与算法/工具等原创技术文章和学习资源。

前言

你以为我说的自动变量类型auto吗?非也,我们知道C语言中其实也有auto关键字,它和早期C++中的auto关键字一样,它修饰局部变量,表示自动存储期(更多内容也可以阅读《全局变量,静态全局变量,局部变量,静态局部变量》)不过由于默认就是这种,因此我们其实常常见不到这样的写法:

auto int a =10;

本文要介绍的并不是上面的auto,而是C++11中引入的auto关键字。

效果

看看下面的代码:

#include//来源:公众号【编程珠玑】#includeint main(){    std::vector<int> vec{1,2,3,4,5};    for(std::vector<int>::const_iterator it = vec.begin();it != vec.end();++it)    {        std::cout<std::endl;    }    return 0;}

对于it的类型,你自己能快速写出来吗?我反正是写不出来。

再看auto版本:

#include#includeint main(){    std::vector<int> vec{1,2,3,4,5};    for(auto it = vec.begin();it != vec.end();++it)    {        std::cout<std::endl;    }    return 0;}

是不是简洁了许多?

没错,今天就是介绍自动类型推导关键字auto。

auto的作用

说实在的,程序员有时候就是“懒”,可能连个表达式的类型都不想写,auto就是这样一个关键字,它让编译器替我们去分析表达式的类型。

当然了,分析的前提是auto定义的变量有初值,如果连值都没有,怎么可能知道它是什么类型?

auto用法

普通类型推导

例如:

auto i = 10;//i为int类型auto d = 10.2//d 为double类型auto f = 10.2f//f为float类型

const关键字修饰的类型推导

通常auto会忽略掉顶层const(本身是常量,如int *cosnt p),而会保留底层const(指向的对象是常量,如const int* p)。关于const的更多内容可以参考《C++与C中的const关键字有何差别?》举个例子顶层const的例子:

const int ci = 10;auto aci = ci;//忽略顶层const,推导ci是int,所以aci类型是intconst auto ca = ci//推导ci是int,但是前面有const,所以ca是const int

再说一个底层const的例子:

const int arr[] = {11};auto p = arr;//arr 是const int *,这是底层const,推导后,保留底层const,所以p是 const int*

arr数组名被当成指针是,是const int*类型,或者说是int const*,它指向的对象是只读的,因此是底层const,保留,最终p的类型也是int const *。

当然auto还可以设置引用类型,例如:

const int ci = 10;auto &cp = ci;//cp是一个整型常量引

如果是字面值,则必须加上const:

const auto &ref = 10;//10是字面值,常量引用才能绑定字面值

想一想

想想下面推导的size类型是什么?

std::vector<int> vec;auto size = vec.size();

没错,它是std::vector::size_type。要你写下来你肯定不愿意。

不过下面这样是没法推导的奥:

    vector<string> aa;    //vector bb = aa;//无法推导出模板类型

下面这段程序帮你查看真正类型的名称,仅供参考

#include //编程珠玑#include #include #include int main(){    int     status;    char   *realname;    auto type = 1.1;    realname = abi::__cxa_demangle(typeid(type).name(), 0, 0, &status);    std::cout <typeid(type).name() <" => " <std::endl;    free(realname);    return 0;}

输出结果:

double

总结

乍一看,好像挺简单的那么一回事,不过使用auto最好注意类型推导规则,不是很明确的规则不建议以代码可读性为代价而简化代码。

当然了,它也有以下特点:

  • 可能使得代码可读性差

  • 某些情况auto得到的类型可能不是你想要的

因此一定要合理使用。


●编号611,输入编号直达本文

●输入m获取文章目录

C语言与C++编程

分享C/C++技术文章

c++ auto用法_不想写表达式的类型?试试auto吧相关推荐

  1. js foreach用法_使用 nodejs 写爬虫(一): 常用模块和 js 语法

    本篇是使用 nodejs 写爬虫系列教程的第一篇, 介绍了使用 nodejs 写爬虫过程中常用的模块和一些必须掌握的 js 语法 <!-- more --> 常用模块 常用模块有以下几个: ...

  2. python可以写dnf外挂么_只想写游戏辅助 比如绝地求生 Dnf的 需要学会什么语言呢 C C++可以嚒?...

    其实这些数值都是可以通过技术手段来修改的 像这些 这就是通过修改内存中的游戏数据达到了这个效果 那么这个怎么做到呢? 需要用到计算机逆向方面的一些知识 这里简单给出一些代码和实现步骤 1.过机器码: ...

  3. java 枚举类型enum用法_别再说Python没有枚举类型了,好好看看

    枚举 枚举类型可以看作是一种标签或是一系列常量的集合,通常用于表示某些特定的有限集合,例如星期.月份.状态等. Python 的原生类型(Built-in types)里并没有专门的枚举类型,但是我们 ...

  4. sprintf函数的用法_我在C++项目中对于宏的一些用法

    从上一次写文章到现在已经快2个月了,为啥没更新,因为太忙了! 每天都在为了实现一些麻烦的功能而心急火燎,总是没办法静下心来写文章.所以一直拖延. 对于宏的一些个人用法其实早就想写出来了,碍于时间关系一 ...

  5. C++ auto用法

    C++ auto用法 1.auto就是自动变量 他会自动推断后面的变量类型,进行自动初始化,创建时必须初始化 1.1 普通类型自动推断 auto x = 11; // auto 被推断为 int 类型 ...

  6. c语言写贪吃蛇什么水平_学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释...

    已结贴√ 问题点数:20 回复次数:3 学了一些C语言,也不知道自己学到什么程度,自己想写个贪吃蛇但是写不出来,想看懂下面这个程序,求解释 #include//基本库 #include//系统库 #i ...

  7. java 拉姆表达式_强大的拉姆表达式转Sql 类库 - SqlSugar 隐藏功能之Lambda

    使用场景 1.Lambda to sql 一直是ORM中最难的功能之一,如果有现成的解析库那么自已写一个ORM难度将大大降低 2.通过Lambda作为KEY进行缓存操作,特别是仓储模式想要拿到表达式进 ...

  8. python英雄联盟脚本是什么_用python写王者荣耀脚本!

    00. 前言 今天这篇文章我想很多人都有想过,比如说脚本自动走位,对于王者荣耀和英雄联盟都是怪物级别的存在.但是还是觉得有些不够熟练,自己试过几次才成功. 01. 目录文件分类 前言 有时候,想要对一 ...

  9. 我想写程序#1 之 「先确立志向」

    我想写程序#1 之 「先确立志向」 http://www.dotblogs.com.tw/mis2000lab/archive/2008/09/03/5285.aspx 之前有几篇文章提到这些概念,我 ...

最新文章

  1. win7 dll怎么在xp运行_win7电脑安装软件提示缺少vcruntime140.dll如何解决
  2. gitlab合并分支_GitLab-参考问题
  3. 阿里云服务器Linux配置数据库、jre、tomcat、部署javaweb
  4. python:Anaconda+Pycharm Community版+Django搭建属于自己简易WEB
  5. 阿里docker安装mysql_docker安装mysql
  6. 改镜像_镜像制作大法
  7. HDU5877 - Weak Pair
  8. 永州计算机应用等级,5月永州计算机应用能力考试报名
  9. “不怕的人的面前才有路”!一名双非硕士的985攻博历程
  10. 自定义属性-模态框的改进
  11. 20200515每日一句
  12. 自动驾驶 2-1 传感器和计算硬件 Sensors and Computing Hardware
  13. sql server中扩展存储过程随笔
  14. Tier-1 ISP Tier-2 ISP and Tier-3 ISP
  15. 计算机win7设置用户密码,win7怎么设置开机密码 win7设置开机密码步骤盘点【详解】...
  16. NVIDIA GeForce Experience报错:“验证程序加载失败,请检查您的浏览器设置,例如广告拦截程序”的解决方法
  17. php opc数据,OPC连接获取数据
  18. 诗歌十 寒窑赋(破窑赋)天有不测风云,人有旦夕祸福
  19. H5页面调用微信支付
  20. CenterNet2的深入浅出(CVPR2021)

热门文章

  1. 电脑怎么重置host_电脑又双叒叕卡顿?究竟要“重装”还是“重置”?原来这区别大了...
  2. 最大化窗口设置_Qt学习笔记4(窗口操作及插入图片)
  3. mysql 分表后排序_MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?...
  4. a jquery 标签点击不跳转_form标签的action属性怎么用?form标签action属性的用法介绍(附实例)...
  5. Xcode11 后Appdelegate自定义UIWindow对象失败详解。
  6. mysql连接不上远程数据库_Mysql 连接不上远程数据库,求助
  7. python如何把一张图像的所有像素点的值都显示出来_情人节,教你用 Python 向女神表白...
  8. 目标检测_目标检测: AnchorFree 时代
  9. 计算机设计大赛国奖作品_3. 需求分析
  10. dataframe 如何选中某列的一行_带你领略pandas中多表之间如何处理