C++ 面试题 目录

C++11 新增了哪些特性?

推荐答案

C++11 新增了以下主要特性:

  1. 自动类型推导auto 关键字用于自动推导变量类型。
  2. 范围 for 循环for (auto& elem : container) 语法简化了容器遍历。
  3. Lambda 表达式:允许在代码中定义匿名函数。
  4. 右值引用和移动语义:引入了 && 语法和 std::move,支持资源的高效转移。
  5. 智能指针:新增了 std::unique_ptrstd::shared_ptrstd::weak_ptr,用于自动管理内存。
  6. nullptr:引入了 nullptr 关键字,替代 NULL 表示空指针。
  7. 委托构造函数:允许一个构造函数调用另一个构造函数。
  8. 继承构造函数:使用 using 关键字继承基类的构造函数。
  9. override 和 finaloverride 用于显式重写虚函数,final 用于阻止派生类重写函数或继承类。
  10. 强类型枚举:引入了 enum class,提供了更强的类型安全性。
  11. 静态断言static_assert 用于编译时断言检查。
  12. 线程支持:引入了 std::threadstd::mutex 等线程相关库。
  13. 新的容器和算法:如 std::arraystd::forward_liststd::unordered_map 等。
  14. 变长模板:支持模板参数包,允许模板接受任意数量的参数。
  15. 用户定义字面量:允许用户定义自己的字面量后缀。

本题详细解读

自动类型推导

C++11 引入了 auto 关键字,允许编译器根据初始化表达式自动推导变量的类型。例如:

这在处理复杂类型时非常有用,可以减少代码冗余。

范围 for 循环

范围 for 循环简化了对容器的遍历操作。例如:

这种语法比传统的迭代器方式更加简洁。

Lambda 表达式

Lambda 表达式允许在代码中定义匿名函数。例如:

Lambda 表达式可以捕获外部变量,并且可以作为函数对象使用。

右值引用和移动语义

右值引用 (&&) 和 std::move 允许资源的高效转移,避免了不必要的拷贝。例如:

移动语义在处理大型对象时非常有用,可以显著提高性能。

智能指针

C++11 引入了三种智能指针:

  • std::unique_ptr:独占所有权的智能指针。
  • std::shared_ptr:共享所有权的智能指针。
  • std::weak_ptr:弱引用,不增加引用计数。

智能指针可以自动管理内存,避免内存泄漏。

nullptr

nullptr 是 C++11 引入的空指针常量,用于替代 NULL。例如:

nullptr 的类型是 std::nullptr_t,可以避免与整数类型的混淆。

委托构造函数

委托构造函数允许一个构造函数调用另一个构造函数。例如:

这种语法可以减少代码重复。

继承构造函数

使用 using 关键字可以继承基类的构造函数。例如:

-- -------------------- ---- -------
----- ---- -
-------
    -------- -- --
--

----- ------- - ------ ---- -
-------
    ----- ----------- -- -- ---- -----
--

这样可以避免在派生类中重复定义构造函数。

override 和 final

override 用于显式重写虚函数,final 用于阻止派生类重写函数或继承类。例如:

-- -------------------- ---- -------
----- ---- -
-------
    ------- ---- ----- --
--

----- ------- - ------ ---- -
-------
    ---- ----- -------- -- -- ----
--

----- ---------- ----- - ------ ---- -
-------
    ---- ----- ----- -- -- -------
--

这些关键字可以提高代码的可读性和安全性。

强类型枚举

enum class 提供了更强的类型安全性。例如:

强类型枚举不会隐式转换为整数,避免了潜在的错误。

静态断言

static_assert 用于编译时断言检查。例如:

如果断言失败,编译将终止并输出错误信息。

线程支持

C++11 引入了多线程支持,包括 std::threadstd::mutexstd::condition_variable 等。例如:

这些库使得多线程编程更加方便和安全。

新的容器和算法

C++11 引入了新的容器和算法,如 std::arraystd::forward_liststd::unordered_map 等。例如:

这些容器和算法提供了更多的选择和灵活性。

变长模板

变长模板允许模板接受任意数量的参数。例如:

这种语法使得模板更加灵活和强大。

用户定义字面量

用户定义字面量允许用户定义自己的字面量后缀。例如:

这种语法可以增强代码的可读性和表达力。

纠错
反馈