move assignment operator (tsz. move assignment operators)
Magyarul a move assignment operator jelentése: mozgató értékadó operátor (szokták még úgy is mondani: áthelyező értékadó operátor).
Ha például egy objektum egy dinamikus tömböt tartalmaz, és az egyik objektumból a másikba értékadás történik, akkor:
A mozgató értékadó operátor a következőképpen néz ki:
ClassName& operator=(ClassName&& other) noexcept;
ClassName&& other
— az argumentum egy rvalue reference (ideiglenes vagy költözhető objektum).noexcept
— opcionális, de ajánlott, hogy jelezze: a művelet nem dob kivételt.#include <iostream>
#include <utility> // std::move
class MyVector {
int* data;
size_t size;
public:
MyVector(size_t s) : size(s), data(new int) {
std::cout << "Constructed\n";
}
~MyVector() {
delete data;
std::cout << "Destroyed\n";
}
// Move assignment operator
MyVector& operator=(MyVector&& other) noexcept {
std::cout << "Move assignment\n";
if (this != &other) {
delete data; // töröljük a jelenlegi adatokat
data = other.data; // átvesszük az erőforrást
size = other.size;
other.data = nullptr; // az eredeti objektumot "üresre állítjuk"
other.size = 0;
}
return *this;
}
void print() const {
std::cout << "Size: " << size << ", Data ptr: " << data << '\n';
}
};
int main() {
MyVector v1(5);
MyVector v2(10);
v2 = std::move(v1); // itt a move assignment operátor fog meghívódni
v1.print(); // kiürült
v2.print(); // átvette az erőforrásokat
}
other
objektumtól.other
objektum "kiürítése", hogy ne próbálja meg kétszer felszabadítani ugyanazt a memóriát.std::move
és az rvalue referenciák bevezetésével.