1.C++11的新特性有哪些
语法的改进 (1)统⼀的初始化⽅法 (2)成员变量默认初始化 (3)auto关键字: 允许编译器⾃动推断变量的类型,减少类型声明的冗余。 (4)decltype 求表达式的类型 (5)智能指针 std::shared_ptr 和 std::unique_ptr (6)空指针 nullptr: 提供了明确表示空指针的关键字,替代了传统的 NULL 。 (7)基于范围的for循环: 简化遍历容器元素的语法 (8)右值引⽤和move语义 引⼊右值引⽤和移动构造函数,允许⾼效地将资源从⼀个对象移动到另⼀个对 象,提⾼性能。 标准库扩充(往STL⾥新加进⼀些模板类) (9)⽆序容器(哈希表) ⽤法和功能同map⼀模⼀样,区别在于哈希表的效率更⾼ (10)正则表达式 可以认为正则表达式实质上是⼀个字符串,该字符串描述了⼀种特定模式的字符串 (11)Lambda表达式: 允许在代码中定义匿名函数
2.智能指针
–
3.类型推导
auto:auto可以让编译器在编译期就推导出变量的类型
auto的使⽤必须⻢上初始化,否则⽆法推导出类型 auto在⼀⾏定义多个变量时,各个变量的推导不能产⽣⼆义性,否则编译失败 auto不能⽤作函数参数 在类中auto不能⽤作⾮静态成员变量 auto不能定义数组,可以定义指针 auto⽆法推导出模板参数 在不声明为引⽤或指针时,auto会忽略等号右边的引⽤类型和cv限定 在声明为引⽤或者指针时,auto会保留等号右边的引⽤和cv属性 decltype:decltype则⽤于推导表达式类型,这⾥只⽤于编译器分析表达式的类型,表达式实际不会进⾏运算。
exp是表达式,decltype(exp)和exp类型相同 exp是函数调⽤,decltype(exp)和函数返回值类型相同 其它情况,若exp是左值,decltype(exp)是exp类型的左值引⽤
4.左值和右值
左值:指表达式结束后依然存在的持久对象。可以取地址,可以通过内置(不包含重载) & 来获取地址,我们可以将一个右值赋给左值。 右值:表达式结束就不再存在的临时对象。不可取地址,不可以通过内置(不包含重载) & 来获取地址。由于右值不可取地址,因此我们不能将任何值赋给右值。 使用 = 进行赋值时,= 的左边必须为左值,右值只能出现在 = 的右边。
int x = 666 ;
int * y = x;
int * z = & 666
666 = x;
int a = 9 ;
int b = 4 ;
int c = a + b
a + b = 42 ;
5.nullptr
C++11引⼊nullptr关键字来区分空指针和0。nullptr 的类型为 nullptr_t,能够转换为任何指针或成员指针的类型,也可以进⾏相等或不等的⽐较。 NULL:预处理变量,是一个宏,它的值是 0,定义在头文件 中,即 #define NULL 0。 nullptr:C++ 11 中的关键字,是一种特殊类型的字面值,可以被转换成任意其他类型。
6.范围for循环
for(变量:对象)
std:: vector< int > arr ( 5 , 100 ) ;
for ( std:: vector< int > :: iterator i = arr. begin ( ) ; i != arr. end ( ) ; i ++ ) {
std:: cout << * i << std:: endl;
}
for ( auto & i : arr) {
std:: cout << i << std:: endl;
}
7.lambda 表达式
lambda表达式表示⼀个可调⽤的代码单元,没有命名的内联函数,不需要函数名因为我们直接(⼀次性的)⽤它,不需要其他地⽅调⽤它。
[ capture list] ( parameter list) -> return type { function body }
auto lam = [ ] ( ) -> int { cout << "Hello, World!" ; return 88 ; } ;
auto ret = lam ( ) ;
cout<< ret<< endl;
参考
Leetcodec++面试突破
代码随想录–最强八股文c++