面试题答案
一键面试- 移动构造函数被调用的情况:
- 当
std::vector
的容量(capacity)不足以容纳新元素时,std::vector
会重新分配内存。在重新分配内存的过程中,如果MyClass
对象是右值(rvalue),移动构造函数会被调用。 - 当使用
emplace_back
直接在std::vector
的末尾构造对象,并且构造函数的参数是右值时,移动构造函数会被调用。 - 当使用
push_back
添加一个右值对象时,移动构造函数会被调用。
- 当
- 代码示例:
#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
末尾构造对象,这种情况下也会调用移动构造函数。