当面试官问我C++ 11新特性的时候,应该怎样回答?

2,514 阅读4分钟

关于C++11,介绍的时候,先分个类吧:

  1. 革新
  2. 语法糖
  3. 标准库的扩充
  4. 老语法bug的fixed

面试官最想听的肯定是第1点,然后第2点。没得聊了就聊第3点、第4点。

1. 革新有啥呢?

很多啊。一言以蔽之是啥?——模板。模板肯定不是C++的新事物,但C++11的很多革新确实是围绕模板展开的,或者说都能和模板搭上点暧昧关系。。(个人感觉智能指针真的没什么好谈的,想装逼,谈模板)

decltype关键字,编译期推导表达式类型。

可变参数模板(class...、typename... ),这真是元编程强有力的帮手。

函数模板的默认模板参数(叫做语法糖,似乎也可以);模板的别名(这个其实真的是语法糖了)

然后就是几乎你不说,面试官也可能会问你的右值引用(&&),move语义(std::move)和完美转发(std::forward<T>(t))啦。它们的出现除了进一步提升了C++的性能,另外你能说它和模板一点关系都没有?

综上,自此C++编程终于从一门严肃的编程语言开始转向脑筋急转弯了。。

函数对象的概念被扩充了,,不过我感觉都算语法糖吧。

另外还有一个小点——nullptr。。也算是小革新吧,C语言指针的锅该甩了。。另外nullptr真不属于语法糖,这tm要算也应该算个 bug fixed吧。。

2. 语法糖有啥呢?

列举几个:比如auto关键字(自动类型推导),配合容器、迭代器、“各种”函数对象使用简直不要太好。

lambda表达式(匿名函数对象),你可以将其理解为语法革新,但我倾向于它是一种语法糖。因为它要解决的工程问题,C++11之前基本也能做,但比较麻烦,有了lambda则变得十分高效简洁了。

初始化参数列表。。这个肯定也是不得不说的一个语法糖了。。C++真的是向脚本语言学习了很多。。

类的非静态成员在声明时赋值。。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。。

切记,作为程序员在工程实践中,不要贪恋奇技淫巧,小心弄巧成拙。工作了之后,你会发现:很多编程语言的的高级特性,你最后一次用到它是在面试的时候……