MST

星途 面试题库

面试题:C++中移动构造函数在对象容器操作中的应用

假设有一个`std::vector<MyClass>`,其中`MyClass`是自定义类且包含移动构造函数。当向`std::vector`中添加新元素(如使用`push_back`或`emplace_back`)时,移动构造函数会在什么情况下被调用?请结合代码示例说明。
21.6万 热度难度
编程语言C++

知识考点

AI 面试

面试题答案

一键面试
  1. 移动构造函数被调用的情况
    • std::vector的容量(capacity)不足以容纳新元素时,std::vector会重新分配内存。在重新分配内存的过程中,如果MyClass对象是右值(rvalue),移动构造函数会被调用。
    • 当使用emplace_back直接在std::vector的末尾构造对象,并且构造函数的参数是右值时,移动构造函数会被调用。
    • 当使用push_back添加一个右值对象时,移动构造函数会被调用。
  2. 代码示例
#include <iostream>
#include <vector>

class MyClass {
public:
    MyClass() { std::cout << "Default constructor" << std::endl; }
    MyClass(const MyClass& other) { std::cout << "Copy constructor" << std::endl; }
    MyClass(MyClass&& other) noexcept { std::cout << "Move constructor" << std::endl; }
    ~MyClass() { std::cout << "Destructor" << std::endl; }
};

int main() {
    std::vector<MyClass> vec;
    // 初始容量为0,添加第一个元素会导致重新分配内存
    MyClass obj;
    vec.push_back(std::move(obj));// 移动构造函数被调用,因为obj被转为右值

    std::vector<MyClass> vec2;
    // 使用emplace_back直接构造对象,传入右值
    vec2.emplace_back(MyClass());// 移动构造函数被调用,MyClass()是右值

    return 0;
}

在上述代码中:

  • 对于vec.push_back(std::move(obj))obj通过std::move被转为右值,在push_back时,如果vec容量不足需要重新分配内存,就会调用MyClass的移动构造函数。
  • 对于vec2.emplace_back(MyClass())MyClass()是一个临时对象(右值),emplace_back会直接在vec2末尾构造对象,这种情况下也会调用移动构造函数。