之前学C++用的是《C++ primer第四版》,现在找工作就从看的《C++ primer 第五版》,因为想看一些C++11的东西。C++11是一个很大的版本修补,针对这些feature我基本有个大概的了解,接下来我就谈谈自己对这些新的feature的认识。
首先是auto关键词,老实说类型推导的确方便了coding的效率,我平时也在使用,但是个人觉得属于语法糖性质的东西。类型的自动推导就直接导致了变量类型可读性的降低,有种写脚本语言的感觉了。我觉得既然编译时可以推导出类型信息,那这项任务干嘛不交给IDE来自动推导完成呢?比如我在IDE里写auto i=10,那么编译器自动把auto换成int,这样可以提高程序可读性。
lambda表达式非常有用,很多时候用stl的算法模版要传入一个可调用对象,现在就可以不用去定义函数(用标准库的对象模版可能不够用),而且按引用传递还能有闭包,非常棒的功能。
右值引用的引入是一个根本上提高c++的特性,虽然我平时用不到这个库开发才会用到的feature,但是把语言效率提高到极致的改进真心好。
shared_ptr的引入也是一个革命性的改进,之前的auto_ptr已经Deprecated了(实际上基本没人用)。shared_ptr我在用第三方库的时候经常用到,不过也遇到过某个蛋疼的问题,比如有个class是Test,一些函数是这样的void fun(shared_ptr
其实比起语言特性,标准库的改进更让人兴奋。个人最喜欢的是threading多线程的引入,以前为了用threading不得不用boost或者和平台相关的代码,统一后方便了很多。async、atomic相关的feature也太好用了。
此外unordered_set以及unorderd_map的引入让c++终于有标准的hash表了,这个引入真的很解渴。相比之下forward_list和array的引入只是提高了一点而已。regex的引入也很棒,虽然用c++来做字符串处理的需求比较小。
最后class里面最方便的可以直接等号初始化成员的特性真心拍手称快,我很多时候写了个很大的class,每次加一个成员变量都要去构造函数里初始化,典型的向java学习。final、override关键字也是跟java里面不错的特性。此外吐槽一下以前java学c++的时候通过类对象可以调用类静态函数照搬然后sb了,我以前一直以为c++不会有这个bad feature,结果最近查漏补缺才发现这个问题。
bind模版淘汰了难用的bind1st、bind2nd这种,function模版的引入也终于把可调用对象、函数和lambda统一。
此外基本是一些语法糖或者类似模版或者比较晦涩少用的feature,我就没有过多的深入了。
以上是我对c++11的理解。
哦,不用了,解决了。改3为5即可。
哦,不用了,解决了。改3为5即可。
哦,不用了,解决了。改3为5即可。
哦,不用了,解决了。改3为5即可。