六、c++11与现代C++
约 1260 字大约 4 分钟
2026-05-11
C++11中的新特性有哪些
C++11 引入了大量新特性以提升代码的 效率、可读性、安全性和并发性,主要包括:
自动类型推导:auto
范围 for 循环:for (auto x : container)
右值引用和移动语义:T&&
智能指针:stdshared_ptr
多线程库:stdmutex
Lambda 表达式:[]{} 语法
constexpr 编译期常量
初始化列表 {} 语法
强类型枚举 enum class
新的标准容器(如 std::unordered_map)
模板改进(变参模板等)
安全性 nullptr、static_assert、delegating constructor 等
左值引用和右值引用的区别
左值引用(T&)绑定到左值(有持久身份的对象),右值引用(T&&)绑定到右值(临时对象或将要销毁的对象)。
右值引用是实现移动语义和完美转发的关键。
简单点说:左值引用给已经存在的变量起了个别名,右值引用专门“捡漏”临时变量的引用,能让资源“偷”过来用而不拷贝,提高效率。
移动语义有什么作用,原理是什么
移动语义允许资源所有权的转移而非复制,通过右值引用(T&&)实现,显著提升性能,特别是对于管理资源的类(如容器、字符串)。
就是让对象实现搬家的目的,而非克隆,把资源给了新对象,省去了复制开销的细节,速度更快
什么是完美转发?完美转发的作用及实现
完美转发解决了函数模板参数转发中的值类别丢失问题。
在C++11之前,模板参数在转发过程中会退化为左值,无法区分原始的左值引用和右值引用。
完美转发通过以下机制实现:
万能引用(Universal Reference):使用T&&模板参数推导
引用折叠规则:确定最终的引用类型
c++中 stdforward的区别
std::move无条件将参数转换为右值引用,用于表示对象可被移动
std::forward有条件地将参数转换为右值引用,用于完美转发参数原始值类别
可以理解为:stdforward是“智能传递”,保持参数原来的“可搬”或“不可搬”状态
lambda函数
Lambda函数是C++11引入的匿名函数对象,用于简化单行或短逻辑代码的就地定义,无需显式命名和提前声明
语法为[捕获列表] (参数列表) -> 返回类型
这里返回类型可省略,它就像就是没有名字的“一次性小函数”,写代码时直接现场定义用,不用提前声明
c++中 STL中仿函数与lambda表达式的性能对比
在现代C++编译器中,仿函数和lambda表达式在性能上基本相当,因为lambda表达式本质上会被编译器转换为匿名仿函数类。
两者在正确使用情况下都能被编译器内联优化,性能差异可以忽略不计。
选择主要基于代码可读性和具体使用场景。
介绍一下 C++中的RAII机制
RAII(Resource Acquisition Is Initialization)是C++的核心编程范式,通过对象的构造函数获取资源,析构函数释放资源,确保资源管理的异常安全。
它将资源生命周期与对象生命周期进行绑定,利用C++的栈展开机制保证资源在任何执行路径下都能正确释放。
C++中的异常处理机制
C++异常处理基于try-throw-catch机制,提供结构化的错误处理方式。
try块定义监控范围,throw抛出异常对象,catch捕获并处理异常。
支持异常类型匹配、栈展开和资源自动清理,通过RAII保证异常安全
C++中的协程概念及实现
C++20引入了协程作为语言级别的异步编程支持。
协程是能够暂停执行并在之后恢复的函数,通过co_await、co_yield、co_return关键字实现。
它包含promise对象、coroutine handle和awaiter三个核心组件,提供比回调更简洁的异步代码编写方式。
