C++98 auto

早在C++98标准中就存在了auto关键字,那时的auto用于声明变量为自动变量,自动变量意为拥有自动的生命期,这是多余的,因为就算不使用auto声明,变量依旧拥有自动的生命期:

int a =10 ;  //拥有自动生命期auto int b = 20 ;//拥有自动生命期static int c = 30 ;//延长了生命期

C++98中的auto多余且极少使用,C++11已经删除了这一用法,取而代之的是全新的auto:变量的自动类型推断。

C++11 auto

auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型,类似的关键字还有decltype。举个例子:

int a = 10;    auto au_a = a;//自动类型推断,au_a为int类型

cout <

typeid运算符可以输出变量的类型。程序的运行结果输出了int

这种用法就类似于C#中的var关键字。auto的自动类型推断发生在编译期,所以使用auto并不会造成程序运行时效率的降低。而是否会造成编译期的时间消耗,我认为是不会的,在未使用auto时,编译器也需要得知右操作数的类型,再与左操作数的类型进行比较,检查是否可以发生相应的转化,是否需要进行隐式类型转换。

auto的用法

上面举的这个例子很简单,在真正编程的时候也不建议这样来使用auto,直接写出变量的类型更加清晰易懂。下面列举auto关键字的正确用法。

用于代替冗长复杂、变量使用范围专一的变量声明。

想象一下在没有auto的时候,我们操作标准库时经常需要这样:#include

#include

int main()

{

std::vector<:string> vs;

for (std::vector<:string>::iterator i = vs.begin(); i != vs.end(); i++)

{

//...

}

}

这样看代码写代码实在烦得很。有人可能会说为何不直接使用using namespace std,这样代码可以短一点。实际上这不是该建议的方法(C++Primer对此有相关叙述)。使用auto能简化代码:#include

#include

int main()

{

std::vector<:string> vs;

for (auto i = vs.begin(); i != vs.end(); i++)

{

//..

}

}

for循环中的i将在编译时自动推导其类型,而不用我们显式去定义那长长的一串。

在定义模板函数时,用于声明依赖模板参数的变量类型。template

void Multiply(_Tx x, _Ty y)

{

auto v = x*y;

std::cout <

}

若不使用auto变量来声明v,那这个函数就难定义啦,不到编译的时候,谁知道x*y的真正类型是什么呢?

模板函数依赖于模板参数的返回值template

auto multiply(_Tx x, _Ty y)->decltype(x*y)

{

return x*y;

}

当模板函数的返回值依赖于模板的参数时,我们依旧无法在编译代码前确定模板参数的类型,故也无从知道返回值的类型,这时我们可以使用auto。格式如上所示。decltype操作符用于查询表达式的数据类型,也是C++11标准引入的新的运算符,其目的也是解决泛型编程中有些类型由模板参数决定,而难以表示它的问题。auto在这里的作用也称为返回值占位,它只是为函数返回值占了一个位置,真正的返回值是后面的decltype(_Tx*_Ty)。为何要将返回值后置呢?如果没有后置,则函数声明时为:

decltype(x*y)multiply(_Tx x, _Ty y)

而此时x,y还没声明呢,编译无法通过。

注意事项auto 变量必须在定义时初始化,这类似于const关键字。

定义在一个auto序列的变量必须始终推导成同一类型。例如:

auto a4 = 10, a5 = 20, a6 = 30;//正确auto b4 = 10, b5 = 20.0, b6 = 'a';//错误,没有推导为同一类型

使用auto关键字做类型自动推导时,依次施加一下规则:

如果初始化表达式是引用,则去除引用语义。int a = 10;

int &b = a;

auto c = b;//c的类型为int而非int&(去除引用)

auto &d = b;//此时c的类型才为int&

c = 100;//a =10;

d = 100;//a =100;

如果初始化表达式为const或volatile(或者两者兼有),则除去const/volatile语义。const int a1 = 10;

auto  b1= a1; //b1的类型为int而非const int(去除const)

const auto c1 = a1;//此时c1的类型为const int

b1 = 100;//合法

c1 = 100;//非法

如果auto关键字带上&号,则不去除const语意。const int a2 = 10;

auto &b2 = a2;//因为auto带上&,故不去除const,b2类型为const int

b2 = 10; //非法

这是因为如何去掉了const,则b2为a2的非const引用,通过b2可以改变a2的值,则显然是不合理的。初始化表达式为数组时,auto关键字推导类型为指针。int a3[3] = { 1, 2, 3 };

auto b3 = a3;

cout <

若表达式为数组且auto带上&,则推导类型为数组类型。int a7[3] = { 1, 2, 3 };

auto & b7 = a7;

cout <

函数或者模板参数不能被声明为autovoid func(auto a)  //错误

{

//...

}

时刻要注意auto并不是一个真正的类型。auto仅仅是一个占位符,它并不是一个真正的类型,不能使用一些以类型为操作数的操作符,如sizeof或者typeid。cout <

cout <

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。

auto头文件 qt_C++ auto 关键字的使用相关推荐

  1. C++ 局部变量及初始化 auto 头文件防卫式声明 引用 常量

    cpp文件 project3 #include<iostream> #include"head1.h" #include"head2.h" usin ...

  2. C/C++头文件与变量的声明和定义

    版权声明:本文为博主转载文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 原文链接:https://blog.csdn.net/mountzf/article/deta ...

  3. dbm数据库源代码分析(4):头文件部分(续)

    (7)proto.h:dbm例程的所有函数原型声明.包括内部接口和gdbm的用户接口.ndbm和dbm的兼容性实现也要用到这里的各个函数.这些函数的功能在具体的源代码解剖时会有详细说明.注意一些老式的 ...

  4. 头文件中定义全局变量

    引言 这些天写的程序中用到了全局变量,一开始是在一个文件下做测试后来把文件按逻辑拆分了一下,不同的代码被放在了几个文件中,最后用Makefile来编译就遇到了今天的话题,怎么在头文件中定义全局变量呢? ...

  5. C++ 11 深度学习(一)auto、头文件防卫、引用、常量

    1.数组初始化 int a[]{ 1,2,3,4,5 }; 2.C++11 auto auto可以在声明变量的时候根据变量的初始值的类型自动为此变量先择合适的类型,声明时要赋予初值. auto自动推导 ...

  6. C语言之头文件,static与const关键字

    [前言] 最近几个月在做一个C语言代码重构的项目,过程中也让我对之前在书本上学习到的东西有些补充和巩固,在本博中总结记录下,梳理下零碎的知识点和经验也加深印象,书写是为了更好地思考.平时也都是用印象笔 ...

  7. 【C++基础】auto关键字(C++11)(auto的使用细则;auto不能推导的场景;auto的使用场景;基于范围的for循环)

    九.auto关键字 9.1 auto简介 在早期C/C++(C++98)中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,但遗憾的是一直没有人去使用它.因为在函数内定义的变量默认 ...

  8. static和头文件,源文件放什么

    目录 头文件or源文件 1.局部静态变量 2.全局静态变量/普通的全局静态函数 3.静态数据成员.成员函数(面向对象) 头文件or源文件 a)头文件应该放: 1)普通的全局函数声明 2)普通的全局变量 ...

  9. C++头文件sstream笔试常见用法

    <sstream>库定义了三种类:istringstream.ostringstream和stringstream,分别用来进行流的输入.输出和输入输出操作.本文主要介绍一些实用用法. 1 ...

最新文章

  1. 一个事务中 可以查询自己未提交的数据吗_数据库事务的方方面面
  2. 如何用AI实现视频防抖?还是无需裁剪画面的那种 | 谷歌台湾大学
  3. java反射 基本知识
  4. JVM异常之:方法区溢出OutOfMemoryError: PermGen space
  5. Mac下Sublime text2中文乱码问题的解决
  6. 使用 docker 部署常用的开发环境
  7. Google File System 学习笔记
  8. JVM 内存监控 (1.8)
  9. java之sleep、wait、yield、join、notify乱解
  10. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)
  11. 【Java 数据结构】二叉树的遍历和基本操作
  12. vcpkg如何全面卸载和重新安装包
  13. IIS DirectoryEntry
  14. FPGA作业1:利用74161设计20进制计数器
  15. 用友U8去除凭证外部凭证标记
  16. 洛谷 P1069 细胞分裂
  17. 崩坏3服务器维护2月8号,崩坏3影骑士月轮将在2月8日更新后正式登场
  18. 外卖——仿饿了么的外卖平台
  19. 海尔简爱s11装Linux,海尔简爱S11值得买吗 海尔简爱S11全面深度评测详解
  20. 企业微信如何发成绩给家长-Leo老师来教你

热门文章

  1. 苹果6访问限制密码4位_苹果ios签名:AppleID为什么开启双重认证那么重要
  2. ENSPAC的web配置直接转发
  3. java 课设 商品库存管理系统
  4. C语言 金明的预算方案(动态规划):金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用 的很宽敞的房间。
  5. ajax爬虫小案例(百度翻译)
  6. Ubuntu18.04 笔记本合上盖子时不进入休眠
  7. 岩板铺地好吗_**岩板铺地「泉州泰亨石材供应」
  8. 我的产品经理书单(2017-2019)
  9. 旅行青蛙服务器维护时间,旅行青蛙小青蛙多久出门一次?要什么时候才会出门...
  10. 人工智能调度如何改变现场服务行业