Tehtävätoiminto C++:ssa

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 4. kesäkuuta 2017 tarkistetusta versiosta . tarkastukset vaativat 5 muokkausta .

Osoitusoperaattori C++ - ohjelmointikielessä on merkitty '='-merkillä. Kuten muutkin C++:n operaattorit, se voi olla ylikuormitettu .

Kopiointitoiminto on erityinen määritystoiminto, jota käytetään saman luokan objektien osoittamiseen toisilleen. Se on yksi erikoisfunktion jäsenistä , ja kääntäjä luo sen automaattisesti, jos ohjelmoijalta ei ole nimenomaista ilmoitusta. Kääntäjän luoma koodi kopioi bittikohtaisesti.

Kopioinnin määritysoperaattori eroaa kopiointikonstruktorista siinä, että sen on siivottava tehtävän kohteen datajäsenet (ja käsiteltävä itsemäärittelyä oikein), kun taas kopiokonstruktori antaa arvoja alustamattomille datajäsenille. [1] Esimerkiksi:

My_Array ensin ; // alustus oletuskonstruktorilla My_Array second = first ; // alustus kopiokonstruktorilla second = first ; // määritys kopiointimääräystoiminnolla

Erikoistapauksena on huomioitava seuraava kopiointikonstruktorin alustusversio:

Oma_taulukko toinen = Oma_taulukko ();

Tässä tapauksessa kääntäjä (esim. VC2013) suorittaa välittömästi ilman optimointivaihtoehtoja palautusarvon optimoinnin (RVO, paluuarvon optimointi) eikä kopiointikonstruktoria kutsuta.

Kopioi tehtävän ylikuormitus

Kohteiden syväkopioiden tekemisessä tulee huomioida myös poikkeusten käsittely . Yksi tapa välttää resurssien siirtovirhe on seuraava:

  1. Uusien resurssien hankkiminen
  2. Vanhojen resurssien vapauttaminen
  3. Uuden resurssin arvojen määrittäminen objektille
class My_Array { int * array ; int count ; julkinen : Oma_taulukko & operaattori = ( const My_Array & other ) { if ( this != & other ) // suojaus virheellistä itsemääräämistä vastaan ​​{ // 1: varaa "uusi" muisti ja kopioi elementit int * new_array = uusi int [ muu . laskea ]; std :: kopioi ( muu . array , other . array + other . count , new_array ); // 2: vapaa "vanha" muisti poista [] array ; // 3: anna arvot "uudessa" muistissa objektijonolle = new_array ; count = muu . laskea ; } // sopimuksen mukaan aina return *this return * this ; } ... };

Kuitenkin, jos onnistunut vaihtomenetelmä on kaikkien jäsenten käytettävissä ja luokka toteuttaa kopiokonstruktorin ja -destruktorin ( kolmen säännön mukaan ), lyhin tapa toteuttaa kopiointitehtävä olisi [2] :

julkinen : void swap ( My_Array & other ) // swap jäsentoiminto (ei pitäisi epäonnistua!) { // vaihtaa kaikki jäsenet (ja alla olevat aliobjektit, jos mahdollista) muulla std :llä :: swap ( array , other . array ); std :: swap ( count , other . count ); } My_Array & operator = ( My_Array other ) // Huomaa: argumentti välitetään arvon mukaan! { // vaihda tämä toisella swapilla ( other ); // sopimuksen mukaan aina return *this return * this ; // muu tuhoutuu, vapauttaa muistia }

Syy, miksi toiminto =palaa My_Array&sen sijaan , voidon yksinkertainen. On sallittua yhdistää tehtäviä, kuten:

jono_1 = jono_2 = jono_3 ; // taulukon_3 arvo on määritetty taulukolle 2 // sitten taulukon_2 arvo määritetään taulukolle_1

Katso myös

Linkit

  1. Bjarne Stroustrup . C++-ohjelmointikieli  (uuspr.) . - 3. - Addison-Wesley , 2000. - S. 244. - ISBN 978-0201700732 .
  2. Sutter, H. & Alexandrescu, A. (lokakuu 2004), C++- koodausstandardit , Addison-Wesley , ISBN 0-321-11358-6