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

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

5fe0d24ba6fad1ed7e6e855ff90ebffd.png

前言

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

auto int a =10;

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

效果

看看下面的代码:

#include//来源:公众号【编程珠玑】
#include
int 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
#include
int 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类型是int
const 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++编程

c3b9b104810db69f4e0fc9d462a7728e.png

分享C/C++技术文章

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571778.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅谈内存映射I/O(MMIO)与端口映射I/O(PMIO)的区别

最近在看NVMeDirect和SPDK的源码&#xff0c;觉得有必要梳理一下MMIO和PMIO的区别。关于MMIO和PMIO&#xff0c;维基百科上是这么讲滴&#xff0c; Memory-mapped I/O (MMIO) and port-mapped I/O (PMIO) (which is also called isolated I/O) are two complementary methods o…

linux sftp密码错误,linux个别用户sftp坏掉,验证密码后卡住, 大概是什么问题?...

问题描述linux个别用户sftp坏掉&#xff0c;验证密码后卡住&#xff0c; 大概是什么问题&#xff1f;所有采用sftp的软件都不能用了winsshfs 点击mount后就卡住xftp 连接验证结束后也卡住sublimeText3 的sftp插件也不好用了突然发生的情况之前一直用着都没有问题一直正常使用 只…

c语言 结构体_C语言 技能提升 系列文章 (三)结构体

今天&#xff0c;来跟大家聊一聊C语言中的结构体。在C语言的各种数据类型中&#xff0c;结构体最特别&#xff0c;因为它是可以被程序员定义的&#xff0c;它的特点是非常的灵活。定义struct defined_name{type_name field_name;};结构体内部的成员可以是任意类型的数据&#x…

【转】asp.net Core 系列【一】——创建Web应用

ASP.NET Core 中的 Razor 页面介绍 Razor 页面是 ASP.NET Core MVC 的一个新功能&#xff0c;它可以使基于页面的编码方式更简单高效。 若要查找使用模型视图控制器方法的教程&#xff0c;请参阅 ASP.NET Core MVC 入门。 ASP.NET Core 2.0 必备组件 安装 .NET Core 2.0.0 或更…

基于@FeignClient注解实现两个微服务之间接口的调用(简单)

场景需求&#xff1a;微服务A中的接口input需要调用微服务B中接口的output数据。 实现&#xff1a;使用feign实现即可。 微服务B中的接口&#xff1a; 步骤一&#xff1a;微服务A中编写一个接口&#xff0c;该接口就是调用微服务B的接口&#xff1b;需要在接口上添加FeignClien…

Linux lua 性能,systemTab动态分析linux下lua性能

参考ngx-sample-lua-bt现代linux 动态追踪技术 主要是基于 ebpfsystemtap 是 动态追踪的前端&#xff0c; 技术原理是 编译一个 类似c的脚本 生成 内核模块&#xff0c; 来监控用户空间的lua程序对openResty的脚本改造两点&#xff0c;1&#xff1a; 去掉nginx相关函数的 probe…

spring boot 自动跳转登录页面_徒手撸一个扫码登录示例工程

徒手撸一个扫码登录示例工程不知道是不是微信的原因&#xff0c;现在出现扫码登录的场景越来越多了&#xff0c;作为一个有追求、有理想新四好码农&#xff0c;当然得紧跟时代的潮流&#xff0c;得徒手撸一个以儆效尤本篇示例工程&#xff0c;主要用到以下技术栈qrcode-plugin&…

OpenGL, GLSL, DirectX, HLSL中的矩阵存储形式

&#xff08;原文地址&#xff1a;http://alvincc-tech.blogspot.com/2010/10/opengl-glsl-directx-hlsl.html&#xff09; OpenGL, GLSL, DirectX, HLSL中的矩阵存储形式 OpenGL: 按列存储矩阵(column-major)。调用API形成的矩阵用来和一个列向量相乘&#xff0c;矩阵在左&am…

linux cpp标准库,标准库以及标准头文件

源文件通过编译可以生成目标文件(例如 GCC 下的 .o 和 Visual Studio 下的 .obj)&#xff0c;并提供一个头文件向外暴露接口&#xff0c;除了保护版权&#xff0c;还可以将散乱的文件打包&#xff0c;便于发布和使用。实际上我们一般不直接向用户提供目标文件&#xff0c;而是将…

inputstreamreader未关闭会导致oom_ThreadLocal 一定会导致内存泄露?

在面试的时候&#xff0c;ThreadLocal作为高并发常用工具经常会被问到。而面试官比较喜欢问的问题有以下两个&#xff1a;1、ThreadLocal是怎么实现来保证每个线程的变量副本的。2、ThreadLocal的内存泄露是怎么产生的&#xff0c;怎么避免内存泄露。首先我们来看第一个问题&am…

字符串的格式化

字符串作为一种常见的数据类型&#xff0c;也有其不同之处&#xff0c;其中最特别的当属字符串的格式化。 对于“格式化”估计很多的人有点懵&#xff0c;先来看一个例子。 >>> price of eggs: $%d % 3.5 字符串 price of eggs: $3 被格式化后的结果…

学生实验平台搭建c语言程序,c语言程序设计实验学生用.doc

c语言程序设计实验学生用C语言程序设计实验指导(学生用)计算机基础教研室《C语言程序设计》课程组2012年9月前 言《C语言程序设计》是计算机科学技术系面向全校理工科开设地一门专业平台课程.通过这门课程地学习,可以让学生了解程序设计地思想和方法,掌握高级语言程序设计地基本…

keras保存模型_TF2 8.模型保存与加载

举个例子&#xff1a;先训练出一个模型import 接下来第一种方法&#xff1a;只保留模型的参数&#xff1a;这个有2种方法&#xff1a;model.save_weights("adasd.h5")model.load_weights("adasd.h5") model.predict(x_test)model.save_weights(./checkpoin…

第一章 Burp Suite 安装和环境配置

Burp Suite是一个集成化的渗透测试工具&#xff0c;它集合了多种渗透测试组件&#xff0c;使我们自动化地或手工地能更好的完成对web应用的渗透测试和攻击。在渗透测试中&#xff0c;我们使用Burp Suite将使得测试工作变得更加容易和方便&#xff0c;即使在不需要娴熟的技巧的情…

mysql57服务无法启动_将mysqld.service服务加入到systemctl

在开始安装二进制MySQL的时候感觉都还挺好&#xff0c;就是在启动服务的时候比较麻烦&#xff0c;一开始是在Centos6下的感觉也没有什么费劲的;但是在Centos7下面还是有点不太适应&#xff0c;不过还好用用就熟悉了&#xff1b;说明一下&#xff0c;我的安装目录在/usr/local/m…

linux raid autodetect,软raid的建立

1 增加磁盘并分区(修改id)fdisk /dev/sdbCommand (m for help): pDisk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits cylinders of 16065 * 512 8225280 bytesDevice Boot Start End Blocks Id System/dev/sd…

input readonly 光标显示问题

input readonly模式下在ie跟火狐访问的时候会有光标会出现&#xff0c;以下方法可解决这个问题 <input type"text" readonly unselectableon onfocus"this.blur()"> 1.unselectableon 是解决ie下光标出现的问题 2.οnfοcus"this.blur() 是解决…

c语言for循环的省略写法,C语言两种for循环写法分析

每个C程序员都知道同一个for循环语句可以有两种写法:A: for (i 0; i B: for (i cnt; i > 0; i--){ }前几天,DEBUG的时候, 发现采用A写法的代码反汇编出来有BUG.当时没有时间记录,环境也没有保存下来.今天尝试重现,又没来出现上次的问题...很奇怪.很久很久以前也听说过这两…

python文字游戏 生成数字菜单_pygame游戏之旅 游戏中添加显示文字

本文为大家分享了pygame游戏之旅的第5篇&#xff0c;供大家参考&#xff0c;具体内容如下 在游戏中添加显示文字&#xff1a; 这里自己定义一个crash函数接口&#xff1a; def crash(): message_diaplay(You Crashed) 然后实现接口函数message_display(text) def message_diapl…

快速排序的改进

package com.txq.test; /*** quicksort,三方面改进&#xff1a;①三数中值选择枢纽元②容量小的时候使用插入排序③重复元素的处理* author XueQiang Tong* date 2017/10/25*/ public class QS {public void quicksort(int []arr,int low,int high){int first low;int last h…