De fapt, sintaxa pentru transmiterea unui argument către un constructor cu parametri este o formă abreviată de scriere a următoarei expresii:
Dot A = Dot ('A', 3,4);
Cu toate acestea, în practică, forma aproape abreviată a sintaxei arătată în exemplu este aproape întotdeauna utilizată.
Spre deosebire de constructor, distrugătorul nu poate avea parametri. Este clar de ce se face acest lucru: nu este necesar să se transmită argumente obiectului care trebuie șters.
Iată regulile care există pentru designeri:
Un constructor de clase este numit ori de câte ori un obiect de clasă este creat;
Constructorul inițializează, de obicei, datele membre ale clasei și memorează memoria membrilor dinamici;
constructorul are același nume ca și clasa a cărui membru este; pentru constructor, tipul valorii returnate nu este specificat; constructorul nu poate returna o valoare; constructorul nu este moștenit;
O clasă poate avea mai mulți constructori supraîncărcați;
constructorul nu poate fi declarat cu modificatorul const. volatile. statice sau virtuale;
Dacă constructorul nu este definit în clasă, compilatorul generează constructorul implicit. care nu au parametri.
Reguli pentru distrugatori
Pentru destructori, există următoarele reguli: destructorul este apelat când obiectul este șters;
Distructorul efectuează, de obicei, lucrul la eliberarea memoriei ocupate de obiect;
Distrugătorul are același nume ca și clasa din care face parte, cu caracterul precedent
; distrugătorul nu poate avea parametri; distrugătorul nu poate reveni la o valoare; distrugătorul nu este moștenit; O clasă nu poate avea mai mult de un destructor;
Distrugătorul nu poate fi declarat cu modificatorul const. volatile sau statice;
dacă clasa nu are un destructor, compilatorul generează distrugătorul implicit.
Subliniem din nou: constructorii și distrugătorii în C ++ sunt chemați automat. garantează că
creare corectă și ștergerea obiectelor de clasă.
Element de inițializare a listei
De obicei, membrii de date de clasă sunt inițializate în organism constructor, dar există o altă modalitate de a inițializa - cu elemente de listă de inițializare. Lista de inițializare a elementelor este separată printr-un colon din antetul definiției funcției și conține clase de date și clase de bază separate prin virgule. Pentru fiecare element din paranteze, imediat după acesta, sunt specificați unul sau mai mulți parametri utilizați în timpul inițializării. Sintaxa listei de inițializare este:
ConstrName (par. Par2). mem1 (parl). mem2 (par2). ... <…>
Următorul exemplu folosește lista de inițializare pentru a inițializa clasa.
// constructor cu lista de inițializare
Dot (numele caracterelor). numele (numele). x (0). y (0) <>
În timp ce inițializarea în corpul unui constructor sau prin inițializarea lista - este o listă de inițializare programator gustul este singura metoda de inițializarea dannyhkonstant și link-uri. În cazul în care un membru al unei clase este un obiect, proiectantul este obligat prin stabilirea unor valori ale unuia sau mai multor parametri, singura cale posibilă este, de asemenea, o listă de inițializare inițializare.
Constructori impliciți
C ++ definește două tipuri speciale de constructori: constructorul implicit, pe care l-am menționat mai sus, și constructorul de copiat. Constructorul implicit nu are parametri (sau toți parametrii săi ar trebui să aibă valori implicite) și se numește atunci când este creat un obiect care nu are argumente. Evitați ambiguitatea atunci când sunați constructori. În exemplul de mai jos, cei doi constructori impliciți sunt ambiguiți:
// constructor implicit
// constructor cu un singur parametru opțional
// poate fi folosit ca constructor implicit
// Utilizează constructorul T :: T (int)
// Nu este adevărat; ambiguitatea apelului T :: T () sau T :: T (int = 0)
Constructori de copiaturi
Constructorul de copiere creează un obiect de clasă, în timp ce copiază date dintr-un obiect existent din această clasă. În acest sens, are ca singurul său parametru o referință constantă la obiectul clasei (const T ) sau doar o referință la obiectul de clasă (T ). Este de preferat utilizarea primei, deoarece aceasta din urmă nu permite copierea obiectelor constante.
Dacă constructorul nu este definit în clasă, compilatorul încearcă să genereze în mod implicit constructorul său și, dacă este necesar, constructorul său propriu de copiere. Acești constructori generați de compilatori sunt tratați ca funcții deschise ale membrilor. Subliniem faptul că compilatorul generează acești constructori dacă niciun alt constructor nu este definit în clasă.
Iată un exemplu de utilizare a constructorului de copiere: