c++八股文:c++新特性

### 文章目录

  • [@[toc]](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)
  • [1.C++11的新特性有哪些](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)
  • [2.智能指针](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)
  • [3.类型推导](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)
  • [4.左值和右值](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)
  • [5.nullptr](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)
  • [6.范围for循环](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)
  • [7.lambda表达式](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)
  • [参考](#文章目录 @[toc] 1.C++11的新特性有哪些 2.智能指针 3.类型推导 4.左值和右值 5.nullptr 6.范围for循环 7.lambda表达式 参考)

1.C++11的新特性有哪些

  1. 语法的改进
    (1)统⼀的初始化⽅法
    (2)成员变量默认初始化
    (3)auto关键字: 允许编译器⾃动推断变量的类型,减少类型声明的冗余。
    (4)decltype 求表达式的类型
    (5)智能指针 std::shared_ptr 和 std::unique_ptr
    (6)空指针 nullptr: 提供了明确表示空指针的关键字,替代了传统的 NULL 。
    (7)基于范围的for循环: 简化遍历容器元素的语法
    (8)右值引⽤和move语义 引⼊右值引⽤和移动构造函数,允许⾼效地将资源从⼀个对象移动到另⼀个对
    象,提⾼性能。
  2. 标准库扩充(往STL⾥新加进⼀些模板类)
    (9)⽆序容器(哈希表) ⽤法和功能同map⼀模⼀样,区别在于哈希表的效率更⾼
    (10)正则表达式 可以认为正则表达式实质上是⼀个字符串,该字符串描述了⼀种特定模式的字符串
    (11)Lambda表达式: 允许在代码中定义匿名函数

2.智能指针

--

3.类型推导

  1. auto:auto可以让编译器在编译期就推导出变量的类型
    • auto的使⽤必须⻢上初始化,否则⽆法推导出类型
    • auto在⼀⾏定义多个变量时,各个变量的推导不能产⽣⼆义性,否则编译失败
    • auto不能⽤作函数参数
    • 在类中auto不能⽤作⾮静态成员变量
    • auto不能定义数组,可以定义指针
    • auto⽆法推导出模板参数
    • 在不声明为引⽤或指针时,auto会忽略等号右边的引⽤类型和cv限定
    • 在声明为引⽤或者指针时,auto会保留等号右边的引⽤和cv属性
  2. decltype:decltype则⽤于推导表达式类型,这⾥只⽤于编译器分析表达式的类型,表达式实际不会进⾏运算。
    • exp是表达式,decltype(exp)和exp类型相同
    • exp是函数调⽤,decltype(exp)和函数返回值类型相同
    • 其它情况,若exp是左值,decltype(exp)是exp类型的左值引⽤

4.左值和右值

  • 左值:指表达式结束后依然存在的持久对象。可以取地址,可以通过内置(不包含重载) & 来获取地址,我们可以将一个右值赋给左值。
  • 右值:表达式结束就不再存在的临时对象。不可取地址,不可以通过内置(不包含重载) & 来获取地址。由于右值不可取地址,因此我们不能将任何值赋给右值。
  • 使用 = 进行赋值时,= 的左边必须为左值,右值只能出现在 = 的右边。
c 复制代码
// x 是左值,666 为右值
int x = 666;   // ok 
int *y = x; // ok
int *z = &666 // error
666 = x; // error
int a = 9; // a 为左值
int b = 4; // b 为左值
int c = a + b // c 为左值 , a + b 为右值
a + b = 42; // error

5.nullptr

  • C++11引⼊nullptr关键字来区分空指针和0。nullptr 的类型为 nullptr_t,能够转换为任何指针或成员指针的类型,也可以进⾏相等或不等的⽐较。
  • NULL:预处理变量,是一个宏,它的值是 0,定义在头文件 中,即 #define NULL 0。
  • nullptr:C++ 11 中的关键字,是一种特殊类型的字面值,可以被转换成任意其他类型。

6.范围for循环

for(变量:对象)

c 复制代码
std::vector<int> arr(5, 100);
for (std::vector<int>::iterator i = arr.begin(); i != arr.end(); i ++) {
 std::cout << *i << std::endl;
}
// 范围for循环
for (auto &i : arr) {
 std::cout << i << std::endl;
}

7.lambda表达式

lambda表达式表示⼀个可调⽤的代码单元,没有命名的内联函数,不需要函数名因为我们直接(⼀次性的)⽤它,不需要其他地⽅调⽤它。
  • lambda表达式语法:
c 复制代码
[capture list] (parameter list) -> return type {function body }
// [捕获列表] (参数列表) -> 返回类型 {函数体 }
// 只有 [capture list] 捕获列表和 {function body } 函数体是必选的
auto lam =[]() -> int { cout << "Hello, World!"; return 88; };
auto ret = lam(); 
cout<<ret<<endl; // 输出88
  • lambda 表达式的特点:

    • 变量捕获才是成就lambda卓越的秘⽅
      • [] 不捕获任何变量,这种情况下lambda表达式内部不能访问外部的变量
      • [&] 以引⽤⽅式捕获所有变量(保证lambda执⾏时变量存在)
      • [=] ⽤值的⽅式捕获所有变量(创建时拷⻉,修改对lambda内对象⽆影响)
      • [=, &foo] 以引⽤捕获变俩个foo, 但其余变量都靠值捕获
      • [&, foo] 以值捕获foo, 但其余变量都靠引⽤捕获
      • [bar] 以值⽅式捕获bar; 不捕获其它变量
      • [this] 捕获所在类的this指针
  • lambda最⼤的⼀个优势是在使⽤STL中的算法(algorithms)库

参考

Leetcodec++面试突破

代码随想录--最强八股文c++

相关推荐
工业甲酰苯胺2 小时前
C语言之输入输出
c语言·c++·算法
C++忠实粉丝2 小时前
计算机网络之NAT、代理服务、内网穿透、内网打洞
网络·c++·网络协议·计算机网络·http·智能路由器
片片叶3 小时前
C++(十四)
开发语言·c++
程序猿阿伟4 小时前
《C++巧铸随机森林:开启智能决策新境界》
开发语言·c++·随机森林
阿客不是客4 小时前
深入计算机语言之C++:STL之list的模拟实现
数据结构·c++·stl
祖坟冒青烟5 小时前
Qt 的构建系统
c++
uyeonashi6 小时前
【C++】刷题强训(day14)--乒乓球匡、组队竞赛、删除相邻数字的最大分数
开发语言·c++·算法·哈希算法
妈妈说名字太长显傻7 小时前
【C++】string类
开发语言·c++
丢丢丢丢丢丢~7 小时前
c++创建每日文件夹,放入每日日志
开发语言·c++
華華3557 小时前
读程序题...
开发语言·c++·算法