C++ auto自动类型推导规则和使用详解

 更新时间:2022年08月17日 16:17:44   作者:顽張先生  
C++11 赋予 auto 关键字新的含义,使用它来做自动类型推导。也就是说,使用了 auto 关键字以后,编译器会在编译期间自动推导出变量的类型,这样我们就不用手动指明变量的数据类型了

脚本之家 / 编程助手:解决程序员“几乎”所有问题!
脚本之家官方知识库 → 点击立即使用

一.auto推导规则4点

(1) 引用不是类型,因此auto不能推断出引用

1
2
3
int a = 1;
int& b = a;// b-> int&  用->表示推导出类型,下同
auto c = b;// c->int

(2)auto 在推断引用的类型时,会直接将引用替换为引用指向的对象。

引用不是对象,任何引用的地方都可以直接替换为引用指向的对象。

1
2
3
4
int a = 10;
const int& b = a ;// b-> const int&
auto c = b;  //  c-> int
//相当于 auto c = a;

由于在传递值时,修改这个值不会对原有的数据造成影响,而传递引用时,修改这个值会对修改原有的数据。

(3)auto 关键字推断类型时,如果没有引用符号,那么会忽略值类型的const修饰,而保留修饰指向对象的const

1
2
3
4
5
6
const int i =1;
auto j = i;//j-> int
int a ;
const int* const pi = &a;//第一个const 修饰指针的指向的对象,第二个const修饰pi指向的值。
                         //会忽略第二个const。
auto pi2 = pi;  // pi2 -> int* const

(4)如果有引用符号,那么值类型的const和指向的const都会保留。

1
2
3
int i = 1;
const int* const j = &i;
auto &k = j; //a->const int const &

具体推导例子:

int x = 10;

 推导表达式:推导出变量数据类型:auto被推导的类型:
1auto  *a = &x;     a   被推导为 :int *auto 推导为: int
2auto  b =  &x;     b  被推导为: int*auto 推导为: int *
3auto &c = x ;     c  被推导为:   int&auto 推导为: int
4auto d = c;     d 被推导为:  intauto 推导为: int
5const auto e= x;     e 被推导为: const intauto 推导为:    int
6auto f = e;     f 被推导为: intauto 推导为:    int
7const auto& g = x;     g 被推导为: const int&auto 推导为:    int
8auto& h = g;      h 被推导为:const int&auto 推导为:    int

注意: auto声明的变量必须马上初始化,因为在编译阶段编译器就将其类型推导出来。

auto a;error

二.auto的使用时机

(1)用于推导容器的迭代器:

原本不使用类型推导我们对容器的遍历:

1
2
3
4
for(vector<int>::iterator it = vec.begin(); it! = vec.end(); it++)
{
    cout<<"vec:"<< *it <<endl;
}

使用auto自动类型推导后对容器的遍历:

1
2
3
4
for(auto it = vec.begin(); it! = vec.end(); it++ )
{
    cout>>"vec:"<<*it<<endl;
}

是不是清爽了很多,利用auto自动类型推导,就不需要写一堆迭代器类型了。

(2)书写泛性函数

不知道程序使用时,传入的参数是什么类型时,用auto可以为我们节省不少工作量。

(3)用于函数的返回值类型后置:

和decltypr配合使用,在后文讲述。

到此这篇关于C++ auto自动类型推导规则和使用详解的文章就介绍到这了,更多相关C++自动类型推导内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

蓄力AI

微信公众号搜索 “ 脚本之家 ” ,选择关注

程序猿的那些事、送书等活动等着你

原文链接:https://blog.csdn.net/zooo520/article/details/124675241

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!

相关文章

  • C++入门之模板基础讲解

    C++入门之模板基础讲解

    这篇文章主要为大家介绍了C++入门之模板基础,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • c++只保留float型的小数点后两位问题

    c++只保留float型的小数点后两位问题

    这篇文章主要介绍了c++只保留float型的小数点后两位问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • C语言实现小型电子词典

    C语言实现小型电子词典

    这篇文章主要为大家详细介绍了C语言实现小型电子词典,用户可以进行英译汉、汉译英等功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-03-03
  • C++实现LeetCode(21.混合插入有序链表)

    C++实现LeetCode(21.混合插入有序链表)

    这篇文章主要介绍了C++实现LeetCode(21.混合插入有序链表),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C语言 const修饰普通变量和指针的操作代码

    C语言 const修饰普通变量和指针的操作代码

    这篇文章主要介绍了C语言const修饰普通变量和指针,用const修饰普通变量时,是在语法层面限制了变量的修改,但是本质上,变量还是变量,是一种不能被修改的变量,本文通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-08-08
  • boost.asio框架系列之buffer函数

    boost.asio框架系列之buffer函数

    这篇文章介绍了boost.asio框架系列之buffer函数,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C语言实现的学生选课系统代码分享

    C语言实现的学生选课系统代码分享

    这篇文章主要介绍了C语言实现的学生选课系统代码分享,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • C语言 队列的实现全解析

    C语言 队列的实现全解析

    队列(Queue)与栈一样,是一种线性存储结构,它具有如下特点:队列中的数据元素遵循“先进先出”(First In First Out)的原则,简称FIFO结构。在队尾添加元素,在队头删除元素
    2022-04-04
  • 详解PID控制器原理

    详解PID控制器原理

    什么是 PID?它是一种在编程中使用的基本方法,如果正确调整,可以令人难以置信的有效和准确,PID代表比例积分微分,3个单独的部分连接在一起,虽然有时你不需要三个都使用。例如,您可以改为有P控制,PI控制或PD控制
    2021-06-06
  • Visual Studio Code配置C/C++开发环境的教程图解

    Visual Studio Code配置C/C++开发环境的教程图解

    这篇文章主要介绍了Visual Studio Code配置C/C++开发环境的教程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论