转载自https://blog.csdn.net/xiaoquantouer/article/details/51647865

一、用途

auto是c++程序设计语言的关键字。用于两种情况

(1)声明变量时根据初始化表达式自动推断该变量的类型

(2)声明函数时函数返回值的占位符


二、简要理解

auto可以在声明变量时根据变量初始值的类型自动为此变量选择匹配的类型。

举例:对于值x=1;既可以声明: int x=1 或 long x=1,也可以直接声明 auto x=1

三、用法

根据初始化表达式自动推断被声明的变量的类型,如:

  1. auto f = 3.14; //double
  2. auto s("hello"); //const char*
  3. auto z = new auto(9); //int *
  4. auto x1 = 5, x2 = 5.0, x3 = 'r'; //错误,必须是初始化为同一类型

但是,这么简单的变量声明类型,不建议用auto关键字,而是应更清晰地直接写出其类型。

auto关键字更适用于类型冗长复杂、变量使用范围专一时,使程序更清晰易读。如:

  1. std::vector<int> vect;
  2. for(auto it = vect.begin(); it != vect.end(); ++it)
  3. { //it的类型是std::vector<int>::iterator
  4. std::cin >> *it;
  5. }

或者保存lambda表达式类型的变量声明:

  auto ptr = [](double x){return x*x;};//类型为std::function<double(double)>函数对象

四、优势

(1)拥有初始化表达式的复杂类型变量声明时简化代码。

比如:

  1. #include <string>
  2. #include <vector>
  3. void loopover(std::vector<std::string>&vs)
  4. {
  5. std::vector<std::string>::iterator i=vs.begin();
  6. for(;i<vs.end();i++)
  7. {
  8. }
  9. }

变为:

  1. #include <string>
  2. #include <vector>
  3. void loopover(std::vector<std::string>&vs)
  4. {
  5. for( auto i=vs.begin();;i<vs.end();i++)
  6. {
  7. }
  8. }

使用std::vector<std::string>::iterator来定义i是C++常用的良好的习惯,但是这样长的声明带来了代码可读性的困难,因此引入auto,使代码可读性增加。并且使用STL将会变得更加容易

(2)可以避免类型声明时的麻烦而且避免类型声明时的错误。

但是auto不能解决所有的精度问题。比如:

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {
  5. unsigned int a=4294967295;//最大的unsigned int值
  6. unsigned int b=1;
  7. auto c=a+b;
  8. cout<<"a="<<a<<endl;
  9. cout<<"b="<<b<<endl;
  10. cout<<"c="<<c<<endl;
  11. }

上面代码中,程序员希望通过声明变量c为auto就能解决a+b溢出的问题。而实际上由于a+b返回的依然是unsigned int的值,姑且c的类型依然被推导为unsigned int,auto并不能帮上忙。这个跟动态类型语言中数据hi自动进行拓展的特性还是不一样的。

五、注意的地方

(1)可以用valatile,pointer(*),reference(&),rvalue reference(&&) 来修饰auto

  1. auto k = 5;
  2. auto* pK = new auto(k);
  3. auto** ppK = new auto(&k);
  4. const auto n = 6;

(2)用auto声明的变量必须初始化

(3)auto不能与其他类型组合连用

(4)函数和模板参数不能被声明为auto

(5)定义在堆上的变量,使用了auto的表达式必须被初始化

  1. int* p = new auto(0); //fine
  2. int* pp = new auto(); // should be initialized
  3. auto x = new auto(); // Hmmm ... no intializer
  4. auto* y = new auto(9); // Fine. Here y is a int*
  5. auto z = new auto(9); //Fine. Here z is a int* (It is not just an int)

(6)以为auto是一个占位符,并不是一个他自己的类型,因此不能用于类型转换或其他一些操作,如sizeof和typeid

(7)定义在一个auto序列的变量必须始终推导成同一类型

auto x1 = 5, x2 = 5.0, x3='r';  /<span style="font-family: Arial, Helvetica, sans-serif;">/错误,必须是初始化为同一类型</span>

(8)auto不能自动推导成CV-qualifiers (constant & volatile qualifiers)

(9)auto会退化成指向数组的指针,除非被声明为引用

C++ auto类型用法总结相关推荐

  1. C++中的sta::atomic<bool>和auto类型

    文章目录 sta::atomic auto类型用法总结 sta::atomic 最基本的原子整数类型是std::atomic(可以使用预定义的别名std::atomic_bool),这是一个比std: ...

  2. C++中的 auto类型详解

    auto是c++程序设计语言的关键字.用于两种情况 (1)声明变量时根据初始化表达式自动推断该变量的类型 (2)声明函数时函数返回值的占位符 参考文章:c++ auto类型用法总结

  3. T1275找出井字棋的获胜者+auto的用法

    题目:找出井字棋的获胜者 A 和 B 在一个 3 x 3 的网格上玩井字棋. 井字棋游戏的规则如下: 玩家轮流将棋子放在空方格 (" ") 上. 第一个玩家 A 总是用 " ...

  4. c++ 中auto 类型

    在 C++11 之前的版本(C++98 和 C++ 03)中,定义变量或者声明变量之前都必须指明它的类型,比如 int.char 等:但是在一些比较灵活的语言中,比如 C#.JavaScript.PH ...

  5. VTK:actors的类型用法实战

    VTK:actors的类型用法实战 程序输出 程序完整源代码 程序输出 程序完整源代码 #include <vtkActor.h> #include <vtkActorCollect ...

  6. Effective Modern C++翻译(3)-条款2:明白auto类型推导

    条款2 明白auto类型推导 如果你已经读完了条款1中有关模板类型推导的内容,那么你几乎已经知道了所有关于auto类型推导的事情,因为除了一个古怪的例外,auto的类型推导规则和模板的类型推导规则是一 ...

  7. 关键字typedef、关键字using、auto类型说明符和declytpe类型指示符

    文章目录 类型别名 概念 关键字 typedef 别名声明 (alias declaration) using 指针.常量和类型别名 类型别名简化多维数组指针 auto类型说明符 概念 复合类型.常量 ...

  8. C++ const限定符和auto类型说明符

    const限定符 # 1.限定常量 有时我们希望定义这样的变量:它的值不能被改变.为了满足这一要求,我们使用const对变量的类型加以限定: const int bufSize = 512; 这样就把 ...

  9. C++11 auto类型说明符

    编程时常常需要将表达式的值赋值给变量,这就要求在声明变量前知道表达式的类型,有时候很难预先知道,所以C++11新标准引入了auto类型说明符,其作用就是让编译器替我们去分析表达式的值类型,,auto让 ...

最新文章

  1. mybatis源码分析之事务管理器
  2. 容联雷辉:视频系统由标清进入到移动高清时代
  3. Java容器的遍历之增强for循环
  4. javascript Array学习与使用
  5. Android 获取cpu序列号
  6. 易语言-数据类型及其长度
  7. 算法设计与分析 (知识点总结)
  8. 条码检测系统——基于MATLAB的一维条码识别
  9. java字符串长度_Java字符串长
  10. 网线为什么要分A、B类接法?区别是什么?
  11. psp软件设计需求分析
  12. 选修课:唐宋词鉴赏课堂笔记03
  13. 拉丁超立方抽样的Python实现
  14. hdu1814 Peaceful Commission 2-SAT建图入门
  15. 两种方法设置 .NET/C# 项目的编译顺序,而不影响项目之间的引用
  16. 【数论】GDKOI day1 讲座(数论基本知识 详)
  17. 云服务器修改dns 114,为什么改成114dns就行?
  18. Swift 第三方库整理
  19. MOSFET导通、关断过程详细分析、损耗分析、米勒效应、datasheet解释
  20. 抖音矩阵系统,这个排名很难啊。按?

热门文章

  1. VS2019 使用GIT
  2. 【MVSO影视程序源码】影视自动采集+魔改超强SEO+自定义苹果cms资源站接口
  3. 电子邮件系统哪个好?
  4. Python图片查找轮廓、多边形拟合、最小外接矩形操作实例
  5. Acunetix WVS 11安装及漏洞扫描
  6. 凯利公式指导投资示例
  7. pageoffice 骑缝章_pageoffice实现网页打开编辑保存word文档(基于SSM框架)
  8. uniapp使用Vant-weapp(最新)
  9. 安川机器人程序还原_安川机器人报错代码:功能概要和程序数据简易修复方法...
  10. 常见linux运维选择题