Operace přiřazení v C++

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 4. června 2017; kontroly vyžadují 5 úprav .

Operátor přiřazení v programovacím jazyce C++ je označen znakem '='. Stejně jako ostatní operátory v C++ může být přetížen .

Operace přiřazení kopírování je speciální druh operace přiřazení, která se používá k vzájemnému přiřazení objektů stejné třídy. Je to jeden ze členů speciální funkce a je automaticky generován kompilátorem , pokud programátor výslovně nedeklaruje. Kód vygenerovaný kompilátorem provede bitovou kopii.

Operátor přiřazení kopírování se liší od konstruktoru kopírování v tom, že musí vyčistit datové členy cíle přiřazení (a správně zpracovat samopřiřazení), zatímco konstruktor kopírování přiřazuje hodnoty neinicializovaným datovým členům. [1] Například:

Moje_pole první ; // inicializace výchozím konstruktorem My_Array second = first ; // inicializace pomocí kopírovacího konstruktoru second = first ; // přiřazení operací přiřazení kopírování

Jako zvláštní případ je třeba poznamenat následující variantu inicializace pomocí konstruktoru kopírování:

My_Array second = My_Array ();

V tomto případě kompilátor (například VC2013) okamžitě, bez jakýchkoli optimalizačních možností, provede optimalizaci návratové hodnoty (RVO, optimalizace návratové hodnoty) a konstruktor kopírování není volán.

Přetížení úlohy kopírování

Pokud jde o vytváření hlubokých kopií objektů, je třeba vzít v úvahu také zpracování výjimek . Jeden způsob, jak se vyhnout chybě přesunu prostředku, je následující:

  1. Získávání nových zdrojů
  2. Uvolnění starých zdrojů
  3. Přiřazení objektu hodnot nového zdroje
class My_Array { int * pole ; int počet ; veřejnost : My_Array & operator = ( const My_Array a další ) { if ( this != & other ) // ochrana proti nesprávnému sebepřiřazení { // 1: alokace "nové" paměti a kopírování prvků int * new_array = new int [ other . počítat ]; std :: copy ( other . array , other . array + other . count , new_array ); // 2: uvolni "starou" pamet delete [] pole ; // 3: přiřaďte hodnoty v "nové" paměti pole objektu = new_array ; počet = jiný . počítat ; } // podle konvence vždy return *this return * this ; } ... };

Pokud je však všem členům k dispozici úspěšná metoda výměny a třída implementuje konstruktor kopírování a destruktor (podle pravidla tří ), nejkratší způsob, jak implementovat přiřazení kopie, by byl [2] :

veřejnost : void swap ( My_Array & other ) // swap členskou funkci (nemělo by selhat!) { // zamění všechny členy (a pokud je to možné i podřízené dílčí objekty) s jinými std :: swap ( array , other . array ); std :: swap ( count , other . count ); } My_Array & operator = ( My_Array other ) // Poznámka: argument je předán hodnotou! { // swap to s other swap ( other ); // podle konvence vždy return *this return * this ; // jiné je zničeno, uvolňuje paměť }

Důvod, proč se operace =vrací My_Array&místo voidje jednoduchý. Je povoleno kombinovat úkoly, jako jsou:

pole_1 = pole_2 = pole_3 ; // hodnota pole_3 je přiřazena poli_2 // hodnota pole_2 je přiřazena poli_1

Viz také

Odkazy

  1. Bjarne Stroustrup . Programovací jazyk C++  (neopr.) . - 3. - Addison-Wesley , 2000. - S. 244. - ISBN 978-0201700732 .
  2. Sutter, H. & Alexandrescu, A. (říjen 2004), C++ Coding Standards , Addison-Wesley , ISBN 0-321-11358-6