Hozzárendelési művelet C++ nyelven

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2017. június 4-én felülvizsgált verziótól ; az ellenőrzések 5 szerkesztést igényelnek .

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űvelettel

Kü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.

Másolási feladat túlterhelése

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ő:

  1. Új források megszerzése
  2. A régi források felszabadítása
  3. Az objektumhoz az új erőforrás értékeinek hozzárendelése
class My_Array { int * tömb ; int count ; nyilvános : My_Array & operator = ( const My_Array & other ) { if ( this != & other ) // védelem a helytelen önbeosztás ellen { // 1: "új" memória lefoglalása és elemek másolása int * new_array = new int [ egyéb . gróf ]; std :: copy ( egyéb . tömb , egyéb . tömb + egyéb . szám , új_tömb ); // 2: szabad "régi" memória törlés [] array ; // 3: értékek hozzárendelése az "új" memóriában az objektumtömbhöz = new_array ; count = egyéb . gróf ; } // megegyezés szerint mindig return *this return * this ; } ... };

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

Lásd még

Linkek

  1. Bjarne Stroustrup . A C++ programozási nyelv  (neopr.) . - 3. - Addison-Wesley , 2000. - S. 244. - ISBN 978-0201700732 .
  2. Sutter, H. & Alexandrescu, A. (2004. október), C++ kódolási szabványok , Addison-Wesley , ISBN 0-321-11358-6