重读《C++ primer 第五版》,谈谈对C++11的理解

之前学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& ptr),一旦用到了shared_ptr那么基本上每个函数的参数类型都必须是shared_ptr这样(操作Test*这样的情况不应该存在)。但是实战的时候不会这么完美,也就是说很多时候有老的接口只接受void fun(Test* obj)这样的调用,我们必须保留Test*。但是更普遍的情况是,某些库它提供的某些算法函数只有void fun(shared_ptr& ptr)版本,但是我们之前都是操作的Test* pointer这样的,如果直接把pointer包装成shared_ptr那么肯定就会有问题,所以一种不那么完美的解决方法就是std::shared_ptr ptr (pointer, [](Test* p){},为了使用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的理解。

重读《C++ primer 第五版》,谈谈对C++11的理解》有4个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注