In C ++, spre deosebire, de exemplu, de la C # există conceptul de constructorul copy. Acest constructor este apelat atunci când o copie a unui obiect al unei clase care inițializează noul obiect de același tip. Acesta este constructorul este numit, iar în cazuri mai puțin evidente, în cazul în care există este crearea unei copii temporare a unui obiect.
Inițializează un nou obiect cu un alt obiect de același tip
De exemplu, în timpul inițializării unui obiect de tip A MyClassobektom In același tip are loc crearea unei copii bitwise a obiectului Bc sale de atribuire ulterioară obiect A.
Să avem o clasa ClassName care implementeaza constructor si destructor. O funcție în mainsozdadim tip de obiect ClassName, care atribuie un nou obiect de același tip:
Rezultatul programului va fi:
Constructorul în acest caz, va fi numit doar o singură dată, atunci când un obiect CNAME. Dar destructor va fi chemat pentru ambele entități în timpul finalizarea programului. Și este bine dacă obiectele nu sunt indicii și alocarea dinamică a memoriei. Cu toate acestea, dacă există unul, acesta apare o eroare în timpul rulării. La fel de lucruri neplăcute se poate întâmpla atunci când un obiect este trecut ca un argument la o funcție și returnează un obiect dintr-o funcție.
Transmiterea argumentelor unei funcții
După cum știți, în C și C ++ Argumentele funcției implicite sunt transmise prin valoare. Aceasta este însoțită de crearea unei copii a argumentului, care este implicată în toate expresiile din funcția nu îi este permis să schimbe variabila care a fost trecut la această funcție ca argument. O copie este distrus atunci când părăsesc domeniul de aplicare al funcției. Să, de exemplu, avem un constructor clasa ClassNames implicit și destructor; și funcția funcției (), care trece un obiect de tip ClassName:
Constructor este numit doar o singură dată, atunci când obiectul este creat, în timp ce destructor este numit de două ori - atunci când eliminați copii și atunci când eliminați obiectul. Atunci când un obiect este trecut în funcția de valoare creează bit-copie temporară a acestuia. În cazul în care obiectul sursă are un câmp cu indicele, care este eliberat în conformitate cu volumul necesar de haldei, apoi puțin câte puțin copie temporară va clona, de asemenea, o indicare pointer la aceeași locație de memorie. În cazul în care copia funcția obiectului este distrus pentru a elibera zona de memorie indicat de pointerul. Dar, de asemenea, destructor vine în completarea programului și distruge obiectul în sine, vom trece la funcția, iar a doua oară pentru a elibera memoria deja îndepărtată.
Returnează un obiect dintr-o funcție
A reveni obiect funcția creează o copie temporară a bit-obiect retur. Pentru a face acest lucru, funcția returnează un obiect, iar în interiorul acestuia ar trebui să fie pus în aplicare declarația declarație de returnare, care returnează de fapt valoarea obiectului. Să ne din nou o clasa ClassNames constructori si destructori implementate. De asemenea, permiteți-ne să aibă o funcție care are argumente, dar returnează un obiect de tip ClassName.
Rezultatul programului va fi:
În acest caz, proiectantul este activat de două ori - în timpul creării obiectului în timpul creării cnamei cname1. S-ar părea că destructor ar trebui să lucreze și doar de două ori în distrugerea ambelor obiecte. Dar destructori au fost trei, nu două. Sa întâmplat pentru că în funcția de a reveni generat o copie temporară a obiectului returnat. Că ar fi trebuit atribuite obiectului, care a luat la valoarea de returnare a funcției. Și este această copie a doua într-un rând elimină destructor. Astfel, vom obține din nou posibilitatea de o dată un pointer la aceeași regiune de memorie alocată, care va trebui, de asemenea, pentru a elibera aceeași memorie de două ori.
Constructorul de copiere
constructorul de copiere are ca parametru o referință la un obiect imuabile. Punerea în aplicare a acestui constructor în klasseClassName nostru, de exemplu, cazul cu inițializarea unui obiect.
concluzie
lalka AlexVovolka ghostromaniv Eugene_V oxmap bahdannn ura_arendar ingwarsmith vadim092 iAndrew5 yrk93 JustPain ksune4ka_00x miha2227 mazahaka_tod NazarPalko serothim PetrenkoSergii