A hozzárendelési operátort a C++ programozási nyelvben az '=' jel jelöli. A C++ többi operátorához hasonlóan ez is túlterhelhető -val .
A másolási hozzárendelés művelet egy speciális típusú hozzárendelési művelet, amellyel azonos osztályba tartozó objektumokat rendelnek egymáshoz. Ez az egyik speciális függvénytag, és a fordító automatikusan generálja, ha nincs kifejezett deklaráció a programozótól. A fordító által generált kód bitenként másol.
A másolás-hozzárendelés operátor abban különbözik a másoláskonstruktortól , hogy meg kell tisztítania a hozzárendelés céljának adattagjait (és megfelelően kezelnie kell az önkiosztást), míg a másoláskonstruktor értéket rendel az inicializálatlan adattagokhoz. [1] Például:
Saját_tömb első ; // inicializálás alapértelmezett konstruktorral My_Array second = first ; // inicializálás másoláskonstruktorral second = first ; // hozzárendelés másolási hozzárendelés művelettelKülönleges esetként meg kell jegyezni a másoláskonstruktor általi inicializálás következő változatát:
My_Array second = Saját_tömb ();Ebben az esetben a fordító (pl. VC2013) azonnal, mindenféle optimalizálási lehetőség nélkül elvégzi a visszatérési érték optimalizálását (RVO, return value optimalizálás), és a másolat konstruktor nem hívódik meg.
Az objektumok mélymásolásának készítésénél a kivételkezelést is figyelembe kell venni . Az erőforrás-áthelyezési hiba elkerülésének egyik módja a következő:
Ha azonban egy sikeres cseremódszer minden tag számára elérhető, és az osztály egy másoláskonstruktort és egy destruktort valósít meg ( a hármas szabálya szerint ), akkor a másolási hozzárendelés megvalósításának legrövidebb módja [2] :
nyilvános : void swap ( My_Array és egyéb ) // tagfüggvény csere (nem kell meghibásodnia!) { // az összes tagot (és ha lehetséges, a mögöttes részobjektumokat) felcseréljük más std -vel :: swap ( array , other . array ); std :: csere ( count , other . count ); } My_Array & operator = ( My_Array other ) // Megjegyzés: az argumentumot érték adja át! { // ezt felcseréljük mással swap ( other ); // megegyezés szerint mindig return *this return * this ; // a többi megsemmisült, memória szabadul fel }Egyszerű az oka, hogy a művelet nem =tér vissza . A feladatok kombinálása megengedett, például: My_Array&void
tömb_1 = tömb_2 = tömb_3 ; // a tömb_3 értéke hozzá van rendelve a tömb_2-hez // majd a tömb_2 értéke a tömb_1-hez van rendelve