以下是Bjarne Stroustrup在C++中使用移动赋值操作符的Vector类的示例代码:
#include
#include // for std::move
class Vector {
public:
Vector() : size{0}, elements{nullptr} {}
Vector(const Vector& other) : size{other.size}, elements{new int[other.size]} {
for (int i = 0; i < size; i++) {
elements[i] = other.elements[i];
}
}
Vector(Vector&& other) noexcept : size{other.size}, elements{other.elements} {
other.size = 0;
other.elements = nullptr;
}
Vector& operator=(const Vector& other) {
if (this != &other) {
delete[] elements;
size = other.size;
elements = new int[size];
for (int i = 0; i < size; i++) {
elements[i] = other.elements[i];
}
}
return *this;
}
Vector& operator=(Vector&& other) noexcept {
if (this != &other) {
delete[] elements;
size = other.size;
elements = other.elements;
other.size = 0;
other.elements = nullptr;
}
return *this;
}
~Vector() {
delete[] elements;
}
private:
int size;
int* elements;
};
int main() {
Vector v1;
Vector v2;
// Move assignment
v2 = std::move(v1);
return 0;
}
在上述代码中,Vector类实现了移动赋值操作符operator=(Vector&& other)
。移动赋值操作符接受一个右值引用参数,并用于将右值的资源(在这里是指针elements
和size
)转移给当前对象。在赋值完成后,右值对象的资源被置为默认值(nullptr和0)。
在主函数中,v2
通过使用std::move
将v1
转换为右值引用,并调用移动赋值操作符来将v1
的资源移动给v2
。
这是C++11引入的移动语义的一个示例,它可以提高代码的性能,减少不必要的资源复制。