面经C++11新特性
请问C++11有哪些新特性?
- 新增 auto 关键字,可以根据变量的初始值推断变量类型,但是对于函数的参数和数组的类型不能推断
- 新增 nullptr 关键字,可以代表任意类型的指针。C中的 NULL 为宏定义0,在函数重载的时候可能会有歧义,int or 指针?
- 新增 share_ptr, weak_ptr 等智能指针
- 新增了右值引用 && ,实现了语义移动和完美转发的功能,大大减少了临时变量的重复构造析构的次数,提高了性能
- 新增了STL 容器 array tuple
- 支持使用初始化列表对类进行初始化 好像只有构造函数支持初始化列表
- atomic 原子操作用于多线程资源互斥操作
…
详细介绍一下C++11中的可变参数模板
c++11的可变参数模板对参数进行了高度泛化,可以表示任意数目、任意类型的参数,其语法为在 class 或者 typename 后面带上省略号。省略号作用如下:
- 声明一个包含0到任意个模板的参数的参数包
- 在模板定义的右边,可以将参数包展成一个个独立的参数
C++11可以使用递归函数的方式展开参数包,获得可变参数的每个值。通过递归函数展开参数包,需要提供一个参数包展开的函数和一个递归终止函数。例如。参数包Args ...在展开的过程中递归调用自己,每调用一次参数包中的参数就会少一个,直到所有参数都展开为止。当没有参数时就会调用非模板函数printf终止递归过程。
1 | void print(){ |
详细介绍一下C++11右值引用
C++11 constexpr
c++11之前 const 并无法显式的定义编译时常量和运行时常量 ,
- constexpr 作用于函数他的返回值一定是constexpr; 如果该函数的返回值在编译时期就能确定,那么编译器会将函数优化为一个常量表达式,在编译时就确定它的值,如果不能确定,就和普通的函数一样。
- 作用于 类的构造函数 那么所有成员都是 constexpr 类型的 且 参数的初始化必通过初始化列表来完成,构造函数体为空
- 使用它的优点就是 如果在编译时期就能确定的值 可以在编译时期直接替换 提高运行时的效率 同时相对 宏定义 又有类型检查更安全