Přesouvací operátor přiřazení nebo přesouvací přiřazovací operátor je v programovacím jazyce C++ operátor zapisovaný =, který se používá pro přesun určitého objektu do jiného objektu. Jako většina operátorů v jazyce C++ může být přesouvací přiřazovací operátor přetížený. Stejně jako kopírovací přiřazovací operátor je přesouvací přiřazovací operátor speciální členskou funkcí.
Pokud přesouvací přiřazovací operátor není explicitně definovaný, překladač (C++11 a novější) vygeneruje implicitní přesouvací přiřazovací operátor, jestliže ani kopírovací konstruktor ani přesouvací konstruktor ani kopírovací operátor přiřazení ani destruktor nebyly deklarovány. Pokud však programátor některou z těchto funkcí explicitně definoval, měl by explicitně definovat všechny tzv. pravidlo pěti. Přesouvací přiřazovací operátor má jeden parametr, který je rvalue reference (T&&) na typ T, kde T je objekt, pro který se definuje přesouvací přiřazovací operátor. Přesouvací přiřazovací operátor se liší od přesouvacího konstruktoru tím, že přesouvací přiřazovací operátor se volá na existující objekt, zatímco přesouvací konstruktor se volá na objekt vytvořený touto operací. Po jeho provedení už data druhého objektu nejsou platná.
Přetěžování přesouvacího přiřazovacího operátoru Pro přetížení přesouvacího přiřazovacího operátoru se musí použít následující signatura: T& operator=(T&& data); a musí být splněny následující podmínky: V těle operátoru je třeba zkontrolovat, zda zdrojový objekt není stejný jako cílový. Pokud cílový objekt obsahuje nějaká data, musí být uvolněna. Ukazatel na data zdrojového objektu se musí nastavit na nullptr. Operátor musí vrátit odkaz na *this.
Uvažujme následující přesouvací přiřazovací operátor pro jednoduchou třídu řetězců:class MyString { private: char* data; public: MyString& operator=(MyString&& other) noexcept { if (this != &other) { // Pokud se objekt přesouvá do sebe sama, následující příkazy přeskoč delete[] this->data; // Případná data cílového objektu uvolnit, než budou přepsána this->data = other.data; // Zkopírování ukazatele na řetězec other.data = nullptr; // Vymazání ukazatele ve zdrojovém objektu
return *this; // Vždy vrátit odkaz na sebe
Použití přesouvacího operátoru Při použití přiřazení překladač C++ od verze C++11 použije přesouvací přiřazovací operátor v těchto případech: Pokud je objekt vpravo od přiřazovacího příkazu anonymní Pokud jde o výsledek funkce vrácený hodnotou Je-li použito std::move()
Pokud je na pravé straně přiřazovacího příkazu deklarovaná proměnná a není použito std::move(), použije se kopírovací operátor přiřazení.
Odkazy Reference
Kategorie:C++ Kategorie:Operátory Kategorie:Operace přiřazení