@Author: Runsen

在 C++ 11 之前,每种数据类型都需要在编译时显式声明,在运行时限制表达式的值,但在 C++ 新版本之后,包含了许多关键字,允许程序员将类型推导留给编译器本身。

有了类型推断功能,我们可以花更少的时间写出编译器已经知道的东西。由于所有类型都是在编译阶段推导出来的,编译时间略有增加,但不影响程序的运行时间。

auto 关键字

auto 关键字指定正在声明的变量的类型将自动从其初始值设定项中扣除。对于函数,如果它们的返回类型是 auto,那么它将在运行时由返回类型表达式求值。

用 auto 关键字声明的变量只能在声明时初始化,否则会出现编译时错误

例如:

auto c = a(int)+ b(double)

在上面的代码段中,a是整型,b是双精度型,那么通过编译器的分析,c就被定义成了双精度型。

#include <bits/stdc++.h>
using namespace std;int main()
{auto x = 4;auto y = 3.37;auto ptr = &x;cout << typeid(x).name() << endl<< typeid(y).name() << endl<< typeid(ptr).name() << endl;return 0;
}

输出

i
d
Pi

使用 typeid 来获取变量的类型。typeid 是一个运算符,用于需要知道对象的动态类型的地方。typeid(x).name() 返回 x 数据类型的简写名称,例如,它返回 i 表示整数,d 表示双精度,Pi表示整数指针等。但返回的实际名称主要取决于编译器。

auto 的一个很好的用途是在为容器创建迭代器时避免长时间的初始化。

#include <iostream>
#include <set>
using namespace std;
int main()
{// Create a set of stringsset<string> st;st.insert({ "runsen", "is","22" });for (auto it = st.begin();it != st.end(); it++)cout << *it << " ";return 0;
}

输出

22 is runsen

对于有序STL,输出是有顺的

#include <iostream>
#include <vector>
using namespace std;
int main()
{vector<int> st;st.push_back(1);st.push_back(2);st.push_back(3);for(auto  it = st.begin() ; it != st.end();it++ )cout << *it << endl;return 0;
}

输出

1
2
3

接下来,看一下 auto 和 const 的结合:

int  x = 0;
const  auto n = x;  //n 为 const int ,auto 被推导为 int
auto f = n;      //f 为 const int,auto 被推导为 int(const 属性被抛弃)
const auto &r1 = x;  //r1 为 const int& 类型,auto 被推导为 int
auto &r2 = r1;  //r1 为 const int& 类型,auto 被推导为 const int 类型

下面我们来解释一下:

  • 第 2 行代码中,n 为 const int,auto 被推导为 int。

  • 第 3 行代码中,n 为 const int 类型,但是 auto 却被推导为 int 类型,这说明当=右边的表达式带有 const 属性时, auto 不会使用 const 属性,而是直接推导出 non-const 类型。

  • 第 4 行代码中,auto 被推导为 int 类型,这个很容易理解,不再赘述。

  • 第 5 行代码中,r1 是 const int & 类型,auto 也被推导为 const int 类型,这说明当 const 和引用结合时,auto 的推导将保留表达式的 const 类型。

**auto一般会忽略掉顶层const,但底层const会被保留下来,**比如当初始值是一个指向常量的指针时:

  • int i = 0;
  • const int ci = i, &cr = ci; //ci 为整数常量,cr 为整数常量引用 auto a = ci; // a 为一个整数, 顶层const被忽略
  • auto b = cr; // b 为一个整数,顶层const被忽略
  • auto c = &ci; // c 为一个整数指针.
  • auto d = &cr; // d 为一个指向整数常量的指针(对常量对象区地址是那么const会变成底层const)

如果想编译器推断出的是一个顶层的const类型,需要进行明确说明:
const auto f = ci;

【小白学习C++ 教程】二十、C++ 中的auto关键字相关推荐

  1. 【小白学习C++ 教程】十二、C++面向对象编程中的构造函数和析构函数

    @Author:Runsen 面向对象编程旨在:在编程中实现继承.隐藏.多态等现实世界的实体.OOP 的主要目的是将数据和对它们进行操作的函数绑定在一起. 我们可以说C++中的类,代表一组共享一些共同 ...

  2. 【小白学习C++ 教程】十五、C++ 中的template模板和泛型

    @Author:Runsen template模板在 C++ 中一个简单但非常强大的工具.简单的想法是将数据类型作为参数传递,这样我们就不需要为不同的数据类型编写相同的代码. C++ 添加了两个新关键 ...

  3. 【小白学习C++ 教程】十八、C++ 中文件处理

    @Author:Runsen 在C++中,文件主要通过使用fstream头文件中的fstream.ifstream.ofstream三个类来处理. ofstream:在文件上写入的流类 ifstrea ...

  4. 【小白学习C++ 教程】十四、C++ 中预处理器

    @Author:Runsen 预处理器程序提供预处理器指令,它告诉编译器在编译之前对源代码进行预处理. 所有这些预处理器指令都以"#"符号开头.'#' 符号表示任何以# 开头的语句 ...

  5. 【小白学习C++ 教程】十、C++中指针和内存分配

    @Author:Runsen 指针 指针是保存内存位置地址的变量.我们知道声明的所有变量在内存中都有一个特定的地址.声明一个指针变量来指向内存中的这些地址. 声明指针变量的一般语法是: int p, ...

  6. 【小白学习PyTorch教程】十、基于大型电影评论数据集训练第一个LSTM模型

    「@Author:Runsen」 本博客对原始IMDB数据集进行预处理,建立一个简单的深层神经网络模型,对给定数据进行情感分析. 数据集下载 here. 原始数据集,没有进行处理here. impor ...

  7. 【小白学习PyTorch教程】十六、在多标签分类任务上 微调BERT模型

    @Author:Runsen BERT模型在NLP各项任务中大杀四方,那么我们如何使用这一利器来为我们日常的NLP任务来服务呢?首先介绍使用BERT做文本多标签分类任务. 文本多标签分类是常见的NLP ...

  8. 【小白学习PyTorch教程】十九、 基于torch实现UNet 图像分割模型

    @Author:Runsen 在图像领域,除了分类,CNN 今天还用于更高级的问题,如图像分割.对象检测等.图像分割是计算机视觉中的一个过程,其中图像被分割成代表图像中每个不同类别的不同段. 上面图片 ...

  9. 【小白学习PyTorch教程】十四、迁移学习:微调ResNet实现男人和女人图像分类

    「@Author:Runsen」 上次微调了Alexnet,这次微调ResNet实现男人和女人图像分类. ResNet是 Residual Networks 的缩写,是一种经典的神经网络,用作许多计算 ...

  10. 【小白学习PyTorch教程】十五、BERT:通过PyTorch来创建一个文本分类的Bert模型

    @Author:Runsen 2018 年,谷歌发表了一篇题为<Pre-training of deep bidirectional Transformers for Language Unde ...

最新文章

  1. mysqldump远程备份mysql数据库方法
  2. 【转载】如何去除C#Strings中的空格?
  3. 【安全】基于角色的访问控制
  4. c++ 友元函数,友元类
  5. 捕鱼达人python游戏项目,少儿编程体验课程项目,源码免费分享,内置详细注释,可更改游戏参数;关注获取更多资源
  6. MATLAB遇到问题:MATLAB2020以上版本代码拷到其他低版本电脑出现中文乱码的解决方案
  7. 外行人都能看得懂的机器学习,错过了血亏!
  8. 期货专业术语中英文对照
  9. Vscode python Code Runner中文乱码
  10. PS4 eye camera v2 ROS测试
  11. 如何在服务器发布网站
  12. 学习笔记25 --贴有图片或者二维码的gazebo模型创建
  13. 华为机试真题 C++ 实现【最短木板长度】【100%通过率】【2022.11 Q4 新题】
  14. 魔方(13)齿轮魔方、五阶齿轮魔方(待续)
  15. 一种基于机器学习的电影推荐系统设计
  16. excel计算加权平均方法
  17. 2023牛客寒假算法基础集训营1_20230116「典dp」「典set」「小思维+bfs」「小思维+构造+码力」「位运算博弈(人类智慧)」
  18. 由浅入深玩转华为WLAN—19 漫游系列(6)不同AC之间AP漫游的概述以及二三层漫游处理过程
  19. 在互联网中,资源免费共享还能走多久!
  20. Google I/O 2014? No,Android I/O 2014

热门文章

  1. 深入理解linux根目录结构
  2. java的成员方法_java编程中的成员方法是什么?
  3. python discuz搜索api_Python + Bottle + 谷歌搜索Api 实现简单搜索引擎
  4. 连招 横版 flash 游戏_街机游戏中的无限连究竟有多变态?有种对决叫作没开始就结束了!...
  5. 陶瓷气体放电管型号大全
  6. 通过goole获取手机唯一标识
  7. 95. Unique Binary Search Trees II
  8. html标签处理数据时合并空格
  9. BI Content、Metadata Repository
  10. 使用 nc (Netcat) 建立傳送資料的 socket server