C++ 面试题 目录

C++ 中什么是移动构造函数 (move constructor)?

推荐答案

移动构造函数(Move Constructor)是 C++11 引入的一种特殊构造函数,用于将资源(如动态内存、文件句柄等)从一个对象“移动”到另一个对象,而不是进行深拷贝。移动构造函数通过使用右值引用(&&)来实现,通常用于优化性能,特别是在处理临时对象或需要转移资源所有权时。

移动构造函数的典型形式如下:

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

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

本题详细解读

1. 移动构造函数的作用

移动构造函数的主要作用是高效地转移资源,避免不必要的深拷贝操作。它通常用于以下场景:

  • 临时对象的资源转移
  • 返回局部对象时优化性能
  • 标准库容器(如 std::vector)的扩容操作

2. 右值引用

移动构造函数使用右值引用(&&)作为参数,表示它可以绑定到一个右值(如临时对象或显式标记为右值的对象)。右值引用允许我们“窃取”资源,而不是复制资源。

3. noexcept 关键字

移动构造函数通常标记为 noexcept,以确保在标准库容器(如 std::vector)中移动操作不会抛出异常。这有助于优化容器的性能。

4. 资源转移

在移动构造函数中,资源的所有权从源对象转移到目标对象。源对象的资源指针通常被置为 nullptr,以防止资源被意外释放。

5. 示例代码

以下是一个完整的移动构造函数示例:

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

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

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

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

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

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

在这个示例中,obj1 的资源被移动到 obj2,而 obj1 的资源指针被置为 nullptr,避免了资源的重复释放。

纠错
反馈