Operátor přiřazení (C ++) Assignment operator (C ++) - Assignment operator (C++)

V C ++ programovací jazyk, operátor přiřazení, =, je operátor používá úkol. Stejně jako většina ostatních operátorů v C ++ to může být přetížený.

The operátor přiřazení kopie, často jen nazývaný „operátor přiřazení“, je speciální případ operátoru přiřazení, kde zdroj (pravá strana) a cíl (levá strana) jsou stejného typu třídy. Je to jeden z speciální členské funkce, což znamená, že jeho výchozí verze je generována automaticky kompilátorem, pokud programátor nedeklaruje jednu. Výchozí verze provádí členskou kopii, kde je každý člen kopírován svým vlastním operátorem přiřazení kopírování (který může být také deklarován programátorem nebo generován kompilátorem).

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

My_Array za prvé;           // inicializace výchozím konstruktoremMy_Array druhý(za prvé);   // inicializace kopírovacím konstruktoremMy_Array Třetí = za prvé;   // Také inicializace kopírovacím konstruktoremdruhý = Třetí;           // přiřazení operátorem přiřazení kopie

Návratová hodnota přetíženého operátoru přiřazení

Jazyk umožňuje operátoru přetížení přiřazení mít libovolný návratový typ (včetně prázdnota). Provozovatel je však obvykle definován tak, aby vrátil odkaz na postupníka. To je v souladu s chováním operátora přiřazení pro vestavěné typy (vrácení přiřazené hodnoty ) a umožňuje použití vyvolání operátoru jako výrazu, například v řídicích příkazech nebo v zřetězené přiřazení. Také Standardní knihovna C ++ vyžaduje toto chování u některých typů poskytovaných uživateli.[2]

Přetížení operátor přiřazení kopie

Když hluboké kopie musí být vyrobeny předměty, bezpečnost výjimek je třeba vzít v úvahu. Jedním ze způsobů, jak toho dosáhnout, když přidělení prostředků nikdy selže, je:

  1. Získejte nové zdroje
  2. Uvolněte staré zdroje
  3. Přiřaďte k objektu úchyty nových zdrojů
třída My_Array{    int* pole;    int počet;veřejnost:    My_Array& operátor=(konst My_Array& jiný)    {        -li (tento != &jiný) { // ochrana proti neplatnému vlastnímu přiřazení            // 1: přidělit novou paměť a zkopírovat prvky            int* new_array = Nový int[jiný.počet];            std::kopírovat(jiný.pole, jiný.pole + jiný.počet, new_array);            // 2: uvolnit starou paměť            vymazat[] pole;            // 3: přiřadit nové paměti objektu            pole = new_array;            počet = jiný.počet;        }        // podle konvence, vždy vrať * toto        vrátit se *tento;    }    // ...};

Pokud však dojde k selhání (bez hodu ) vyměnit funkce je k dispozici pro všechny členské podobjekty a třída poskytuje a kopírovací konstruktor a destruktor (což by mělo dělat podle pravidlo tří ), nejpřímější způsob implementace přiřazení kopií je následující:[3]

veřejnost:    prázdnota vyměnit(My_Array & jiný) // členská funkce swap (nikdy by neměla selhat!)    {        // vymění všechny členy (a základní podobjekt, je-li k dispozici) za jiné        použitím std::vyměnit; // z důvodu ADL, který kompilátor použije         // vlastní swap pro členy, pokud existuje        // pád zpět na std :: swap        vyměnit(pole, jiný.pole);        vyměnit(počet, jiný.počet);    }    My_Array & operátor = (My_Array jiný) // poznámka: argument předán hodnotou!    {        // vyměnit to za jiné        vyměnit(jiný);        // podle konvence vždy vrať * toto        vrátit se *tento;        // ostatní jsou zničeny, uvolnění paměti    }

Přiřazení mezi různými třídami

C ++ podporuje přiřazení mezi různými třídami, a to jak implicitně kopírovací konstruktor a operátor přiřazení, pokud je třída cílové instance předkem třídy zdrojové instance:

třída Předek {veřejnost:    int A;};třída Potomek : veřejnost Předek {veřejnost:    int b;};int hlavní(){    Potomek d;    Předek A(d);    Předek b(d);    A = d;}

Kopírování z předků na potomky, které by mohly ponechat pole potomků neinicializované, není povoleno.

Viz také

Reference

  1. ^ Stroustrup, Bjarne (2000). Programovací jazyk C ++ (3. vyd.). Addison-Wesley. p. 244. ISBN  978-0-201-70073-2.
  2. ^ Pracovní koncept, standard pro programovací jazyk C ++, oddíl 17.6.3.1, tabulka 23; http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
  3. ^ Sutter, H.; Alexandrescu, A. (Říjen 2004), C ++ kódovací standardy, Addison-Wesley, ISBN  0-321-11358-6

externí odkazy