Kopier-og-byt- formsproget er et C++- programmeringssprogsprogsprog, der giver dig mulighed for at designe undtagelses - tolerante opgaveudsagn.
Formsproget er baseret på formsproget " At få en ressource er initialisering ".
Formsproget involverer implementeringen af følgende klassemedlemsfunktioner:
Eksempel:
klasse kopierbar { offentligt : Copyable & operator = ( const Copyable & _v ) { kopierbar tmp ( _v ); dette -> swap ( tmp ); returnere * dette ; } void swap ( Kopierbar & _v ) noexcept ; };Undtagelsestolerance betyder, at Copyable& operator=(const Copyable &)der ikke er nogen mening i en opgavesætning, hvor det ville forårsage en hukommelseslækning at kaste en undtagelse.
Tildelingsoperatøren forsøger først at erhverve den "midlertidige kopi af det objekt, der tildeles" ressource ( tmp), og hvis det lykkes, ændrer dens indhold med indholdet af det aktuelle objekt ( this). Da metoden er swaperklæret som ikke at give undtagelser ( noexcept), er det eneste punkt, hvor en undtagelse kan forekomme, når objektet kopieres _v. Hvis kopien mislykkes, når kontrollen ikke metoden swap, ellers tmpfrigiver objektets destruktor de ressourcer, der tidligere var ejet af det aktuelle objekt ( this) (se RAII-formsproget ).
Ovenstående implementering er også modstandsdygtig over for tildelinger af objektet til sig selv ( a=a), men den har overhead forbundet med det faktum, at der også vil blive oprettet en midlertidig kopi i dette tilfælde. Du kan ekskludere omkostninger ved yderligere check:
klasse kopierbar { offentligt : Copyable & operator = ( const Copyable & _v ) { hvis ( dette != & _v ) Kan kopieres ( _v ). bytte ( * dette ); returnere * dette ; } void swap ( Kopierbar & _v ) noexcept ; };Mange C++ Standard Library og STL containere og algoritmer antager en undtagelsesbestandig tildelingsoperator, men uden at bruge kopi-og-byt-formsproget er det nogle gange ret vanskeligt at implementere en sådan tildelingsoperator for klasser, der for eksempel indeholder pointere til forekomster af andre klasser.
Hvis du har en medlemsfunktion swap, der ikke kaster undtagelser, kan du bruge en lignende teknik til at gøre enhver operation på et objekt stærk undtagelsessikker garanti .
For at gøre dette skal du først lave en kopi af det eksisterende objekt, udføre de nødvendige ændringer på kopien og derefter ændre *thisdet midlertidige objekt.