C++11的auto使用方法

auto在C语言已经失去了意义
我们来谈谈C++11的auto使用方法

我们上代码

示例1:

这里的x和y的类型我们没有确定,但是有了上面a和ft的定义,auto可以推导出x是整型,y是double型。x和y分别会被自动识别成int,double型。
不过这里使用auto去编程的可读性很差,如果没有a和ft的定义,auto还要根据数据去定义类型。



示例2:
auto的另一个作用:可以推导出函数的返回类型。


示例3:
这里的x就是指向函数add的函数指针


示例4:
把构建好的对象给给x

auto使得简化了对类型的定义

这里必须是实体的对象去给给x

decltype的使用


这个关键字decltype的作用是识别出实体(这里的10)的类型,并且可以拿这个类型去定义新的变量。b的类型就是x的类型,x是int类型,所以b也是int 类型。

auto应用在容器(范围广)


auto 从容器的begin()开始到末尾打印,但是不能逆向打印。

auto的弊端

但是auto的弊端在:人在看源码,会越看越糊涂!代码清晰度差,如果你不看函数的声明,不知道返回类型,不知道auto推导出的是什么。
对代码的跟踪和识别能力差
阅读源码的能力变弱



如果你不知道fun的返回值,就会很糊涂!

C++11的lambda


请问没有名字的变量有什么?
我们malloc申请的空间就没有名字。

lambda是没有名字的仿函数。

示例1:


把lambda的表达式给给f1,把b传进去,a=b=20;

我们这里的lambda表达式是在主函数的作用域。
什么叫捕获?不捕获?

理解一下这句代码哪个可以哪个不可以使用?

lambda对全局变量和全局函数没有捕获不捕获之说。因为全局变量全局函数所有人都可以使用。lambda是匿名函数自然也可以使用全局变量全局函数。


示例2:
捕获是对谁来讲的呢?

如果我们的lambda是定义在主函数里,那么它的捕获范围就是主函数的所有局部变量都可以使用。这就是捕获。

[]是不捕获,所以我们不能使用主函数的局部变量。更不可能去使用其他函数的局部变量。因为lambda作用域是在主函数里面。捕获是相当于主函数(作用域)来说。

示例3:


这样lambda可以把主函数的所有局部变量以引用的形式进行捕获。
这里对a,b的改变就是对主函数的a,b改变。


出现这个结果是因为我们还没调动lambda


光定义lambda表达式而没有去执行调用它,就不会改变a,b的值

一般情况下,不要拿&引用捕获,否则局部变量,局部变量在使用用lambda捕获,在其他情况可能会被调用改变了。

示例4:

如果是按值捕获,系统认为你捕获进来的是常性值,不让你对其进行修改!

只可读取,不能修改。

示例5:




书写主函数进行测试:








lambda的聪明之处:如果没有用到,就不会构造。如果你用了,就构造了。调动拷贝构造函数创建同名对象! 但是两个Obj是不一样的,产生了副本!!!
虽然名字一样,但是不是同一个对象。

编译器很聪明,如果你不执行Obj.GetValue();不使用Obj,就不会产生写时拷贝!

如果我们定义了10个对象




调用一个对象,但是产生了10个对象的副本。
捕获整个数组,形式要和数组保持一致,也要产生10个副本。

如果是引用捕获,就不产生副本!


示例6:
不让只捕获数组中的某一个元素。


示例7:
可以挑着捕获,可以分形式捕获。


写上全局的lambda是没有意义的。全局域不需要捕获。

示例8:


不能捕获x,因为x是在a的块的作用域里面。
除非捕获函数也在a的块内

示例9:

mutable是易变关键字。在常方法中可以对mutable修饰的变量进行改变。


打印出什么呢???
虽然调用了lambda,但是没有进行打印副本,改的是副本的值。



示例10:
调动f5和调动f4一模一样

示例11:
不能进行相互赋值

示例12:
可以把lambda表达式赋值给函数指针


但是不能把函数指针赋值给lambda表达式

lambda表达式只能够被构建,不能去赋值

示例13:


可以捕获当前函数作用域的局部变量,a,b,
这里的value来自于对象。
但是它捕获this指针并不是捕获一个指针,而是一个对象,value是对象的value值。



第26行可以对value++的原因是什么?

我们捕获到p,不能对p进行改变,但是可以对p指向的进行改变。
我们捕获的是this指针,this指针不能变,但是this指针所指之物可以改变!


示例14:
具体的写到后面

lambda表达式到底是什么?

lambda表达式和仿函数



解析:

构建对象传参进去for_each函数,对count的++就是对x的++,计数。
对象调动仿函数。

下面这个是以lambda表达式


lambda是仿函数的工作

lambda实现多线程打印



10个线程进来都挂起,执行go函数,唤醒所有线程。

用lambda去实现

如果ready为真,从等待函数返回,如果ready为假,就一直等待。

234-C++11的auto和lambda相关推荐

  1. C++11 for(auto x : s)statment 和 for(auto amp; x:s)statment

    C++11  for(auto x : s)statment 和 for(auto & x:s)statment  x 是一个变量,s 是一个序列,该循环将 x 作用于序列 s 中的每个元素( ...

  2. C++11系列学习之二-----lambda表达式

    C++11添加了一项名为lambda表达式的新功能,通过这项功能可以编写内嵌的匿名函数,而不必编写独立函数和函数对象,使得代码更容易理解. lambda表达式的语法如下所示: [capture_blo ...

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

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

  4. C++11中auto的使用

    在C语言中,就有了auto关键字,它被当作是一个变量的存储类型修饰符,表示自动变量(局部变量).它不能被单独使用,否则编译器会给出警告.在C++11标准中,添加了新的类型推导特性.在C ++11中,使 ...

  5. reference to ‘count’ is ambiguous报错解决以及C++11中auto自动变量

    记录一下排坑过程(C++报错 reference to 'count' is ambiguous): 涉及到#命名空间的知识点,以及一些C++11新标准(auto)的记录,只想解决同类问题的小伙伴可以 ...

  6. c++11新特性(4) lambda捕捉块

    lambda表达式中的方括号成为捕捉块,能够在这里指定怎样从所在的作用域中捕捉变量. 捕捉的意思是指能够在该lambda中使用该变量.即能够捕获外部变量在lambda表达式内使用. 能够使用两种方式来 ...

  7. C++11新特性之lambda表达式

    lambda表达式的特性 Lambda 表达式用于定义并创建匿名的函数对象,用于替代简单的函数. lambda表达式的示例代码 lambda表达式的格式为 [ capture ] ( params ) ...

  8. C++11 std::thread-使用lambda表达式-GCC 4.9编译通过

    #include <thread> #include <iostream>int main() {std::thread thread1([](){std::cout<& ...

  9. C++11 之auto

    在那些情况下要申明类型 定义变量类型 函数返回值,函数参数 表达式返回变量类型 auto关键字原理      在定义变量的时候必须申明类型,c++是强语言类型,在编译阶段需要知道类型,这样的好处是程序 ...

最新文章

  1. C++实现十大排序算法(冒泡,选择,插入,归并,快速,堆,希尔,桶,计数,基数)排序算法时间复杂度、空间复杂度、稳定性比较(面试经验总结)
  2. Spring+MybatisPlus实现多数据源
  3. xml方式整合SpringMVC 4整合 Hibernate4
  4. 图像处理:频域滤波_Matlab
  5. 威联通nas怎么更换大硬盘_QNAP NAS在线RAID组态迁移及在线RAID容量扩充教程
  6. 美国警察开特斯拉追疑犯,时速飙到193公里,然后发现没电了...
  7. javafx 示例_JavaFX列表示例
  8. 从底层重学 Java 之四大整数 GitChat链接
  9. 数据结构 - 单链表(Linked List)实现在内存中实现数据以链表形式生成并根据序号排序
  10. 学生使用计算机违纪处理,软件学院违纪学生跟踪教育管理办法
  11. java并发:原子类之AtomicLong
  12. OJ:一道考察多态的题目
  13. 【数据艺术科技1】基于pyhon的高维数据可视化。(1、2维)
  14. 举个栗子~Tableau 技巧(226):用分段条形图呈现数据占比
  15. mysql取出时间最近的一条字段_Mysql 根据时间取出每组数据中最新的一条
  16. Unity学习-熟悉环境
  17. Autohotkey实现粘贴板图片用百度OCR识别
  18. 总谐波失真80_总谐波失真(THD)
  19. day_01HTML
  20. 巴比特 | 元宇宙每日必读:中国互联网企业涌入元宇宙的群像:“只有各种求生欲,没有前瞻创新的雄心”...

热门文章

  1. 【组织架构】中国国家铁路集团有限公司
  2. CSAPP之详解Labs
  3. linux mysql 密码_Linux上mysql修改密码的几种方法和mysql忘记密码的修改方式
  4. Sqoop数据的导入导出与job作业
  5. NLP【自然语言处理】技术路线
  6. php 支付宝手机端_【php源码】支付宝手机支付接口,有回调可接入自己网站
  7. 探究线程与进程的区别这一问题
  8. STM32使用LORA模块通信
  9. hadoop笔记八:Combiner优化MapReduce
  10. 淘宝直播视频下载软件分享地瓜网络技术