Kopioi ja swap idiomi on C++- ohjelmointikielen idiomi, jonka avulla voit suunnitella poikkeuksia sietäviä määrityslausekkeita.
Kielenkäyttö perustuu idiomiin " Resurssin saaminen alustetaan ".
Idiomiin kuuluu seuraavien luokan jäsentoimintojen toteuttaminen:
Esimerkki:
class Kopioitavissa { julkinen : Copyable & operator = ( const Kopioitavissa & _v ) { kopioitava tmp ( _v ); tämä -> swap ( tmp ); palauta * tämä ; } void swap ( Kopioitavissa & _v ) ei paitsi ; };Poikkeustoleranssi tarkoittaa, Copyable& operator=(const Copyable &)että tehtävälauseessa ei ole mitään järkeä, jossa poikkeuksen heittäminen aiheuttaisi muistivuodon.
Osoitusoperaattori yrittää ensin hankkia "määritettävän objektin väliaikaisen kopion" ( tmp) ja, jos se onnistuu, muuttaa sen sisällön nykyisen objektin ( this) sisällöksi. Koska menetelmän on swapilmoitettu jättävän poikkeuksia ( noexcept), ainoa kohta, jossa poikkeus voi tapahtua, on objektin kopioiminen _v. Jos kopiointi epäonnistuu, ohjaus ei saavuta metodia swap, muuten objektin tuhoaja tmpvapauttaa nykyisen objektin ( ) aiemmin omistamat resurssit this(katso RAII-kieli ).
Yllä oleva toteutus vastustaa myös objektin kohdistamista itselleen ( a=a), mutta siihen liittyy se, että tässä tapauksessa luodaan myös väliaikainen kopio. Voit sulkea kulut pois lisätarkastuksella:
class Kopioitavissa { julkinen : Copyable & operator = ( const Kopioitavissa & _v ) { jos ( tämä != & _v ) Kopioitavissa ( _v ). swap ( * tämä ); palauta * tämä ; } void swap ( Kopioitavissa & _v ) ei paitsi ; };Monet C++ Standard Library- ja STL -säilöt ja -algoritmit olettavat poikkeuksia kestävän osoitusoperaattorin, mutta ilman kopioi-ja-vaihto-idiomia on joskus melko vaikeaa toteuttaa tällaista osoitusoperaattoria luokille, jotka sisältävät esimerkiksi osoittimia muut luokat.
Jos sinulla on jäsenfunktio swap, joka ei tee poikkeuksia, voit käyttää samanlaista tekniikkaa saadaksesi minkä tahansa objektin toiminnon vahvan poikkeusturvan takuun .
Tee tämä tekemällä ensin kopio olemassa olevasta objektista, tekemällä tarvittavat muutokset kopioon ja muuttamalla *thissitten väliaikaista objektia.