关于C++11,介绍的时候,先分个类吧:
- 革新
- 语法糖
- 标准库的扩充
- 老语法bug的fixed
面试官最想听的肯定是第1点,然后第2点。没得聊了就聊第3点、第4点。
1. 革新有啥呢?
很多啊。一言以蔽之是啥?——模板。模板肯定不是C++的新事物,但C++11的很多革新确实是围绕模板展开的,或者说都能和模板搭上点暧昧关系。。(个人感觉智能指针真的没什么好谈的,想装逼,谈模板)
decltype关键字,编译期推导表达式类型。
可变参数模板(class...、typename... ),这真是元编程强有力的帮手。
函数模板的默认模板参数(叫做语法糖,似乎也可以);
using与模板的别名(这个其实真的是语法糖了):
using在C++11中语义扩展,有了类型别名的功能。也会你会说之前就有typedef。但是有时候typedef还真不好使,比如你有一个自己的内存分配器myalloc,想给所有STL容器用。在C++11里面你可以:
template <typename T>using MyVec = std::vector<T, myalloc<T>>;
也就是说如果你用typedef的话,那么只能针对具体的类型。而上述的MyVec还不是具体的类型,仍然是一个模板。所有你说using是不是给模板而生的?
然后就是几乎你不说,面试官也可能会问你的右值引用(&&),move语义(std::move)和完美转发(std::forward<T>(t))啦。它们的出现除了进一步提升了C++的性能,另外你能说它和模板一点关系都没有?
综上,自此C++编程终于从一门严肃的编程语言开始转向脑筋急转弯了。。
函数对象的概念被扩充了,,不过我感觉都算语法糖吧。
另外还有一个小点——nullptr。。也算是小革新吧,C语言指针的锅该甩了。。另外nullptr真不属于语法糖,这tm要算也应该算个 bug fixed吧。。
2. 语法糖有啥呢?
列举几个:比如auto关键字(自动类型推导),配合容器、迭代器、“各种”函数对象使用简直不要太好。
lambda表达式(匿名函数对象),你可以将其理解为语法革新,但我倾向于它是一种语法糖。因为它要解决的工程问题,C++11之前基本也能做,但比较麻烦,有了lambda则变得十分高效简洁了。
初始化参数列表/统一初始化方式。。这个肯定也是不得不说的一个语法糖了。
类的非静态成员在声明时赋值。Java程序员肯定笑了。
基于范围的for循环(Java中称作增强for循环)。Java程序员又笑了。
模板的别名……恩,又说了一遍
3. 标准库的扩充
这个其实没啥好谈的,无法就是将boost库里几个备胎转正了。比如智能指针shared_ptr、unique_ptr。另外weak_ptr(本质上不上智能指针,只是shared_ptr的助手),而auto_ptr则是在C++11之前就存在的,现在基本弃用。。还有就是bind啦,并非是unix中socket操作的那个bind哈!而是和快速组装一个函数对象的bind绑定器。
另外就是标准库终于有了“散列容器”,只是它的名字叫unordered_map/unordered_set/……,并非是hash_map/hash_set/……,(可能是因为hash前缀的容器名被第三方库给用烂了,接口又不统一。C++标准委员会只能无奈给孩子改名了,逃)。
还新增了一个容器——元组(tuple)。。感觉也是从脚本语言处得到的inspire吧。。
线程库第一次被纳入到公众库中,从此C++不再需要使用Unix C的API来处理线程和异步啦。当然你把线程库,看做是革新或许也是合理的。
其他新增库还有很多,比如时间日期库——chrono,还有新增了很多算法。。不一一介绍了。
4. bug的fixed
最容易想到的就是模板的>>中间不需要加空格了。。。其他的bug fixed,我抛砖引玉请网友们补充吧(其实一时之间,真的穷举不出来了。。囧)。当然了C++的bug肯定还是存在的,每当你新标准解决了上一代的bug,但是在增加新特性的同时,却会引入更多的bug。。
切记,作为程序员在工程实践中,不要贪恋奇技淫巧,小心弄巧成拙。工作了之后,你会发现:很多编程语言的的高级特性,你最后一次用到它是在面试的时候……
作者:果冻虾仁