Membrii speciali ai claselor

Nu toti membrii unei clase sunt egali -- unii au anumite privilegii faţă de ceilalţi.

În cele ce urmează, C va fi numele unei clase.

1. Constructorul de copiere

Constructorul de copiere este un constructor declarat

C(const C&);
sau
C(C&);

În afara cazurilor normale de folosire a constructorilor, constructorul de copiere este apelat automat în următoarele cazuri:

  1. la transmiterea prin valoare a argumentelor unei funcţii:

    Dacă o funcţie este declarată ca

    void f(C arg);
    
    şi este apelată
      C x;
    ...
      f(x);
    
    atunci, în funcţia f argumentul arg se comportă ca o variabilă locală. Aceasta este creată cu ajutorul constructorului de copiere al clasei C.
  2. la iniţializarea unei variabile locale sau globale prin sintaxa
      C x=y;
    
    unde y este de tip C.

    În acest caz variabila x este construită direct cu ajutorul constructorului de copiere al clasei C, şi nu este construită cu constructorul implicit şi apoi atribuiă.

    Dacă o clasă nu are declarat constructor de atribuire, atunci compilatorul va declara automat unul. Acest constructor este implementat automat de către compilator prin apelul constructorilor de copiere pentru clasele din care derivă C şi a constructorilor de copiere ai membrilor clasei C.

    Dacă nu dorim ca o clasă să fie copiabilă, solişia clasică este să declarăm constructorul de copiere private şi să nu-l implementăm.

    Dacă există mai mulşi constuctori de copiere declaraşi, compilatorul va alege acela care se potriveşte cu argumentul de copiat.

    2. Funcţii declarate automat de către compilator

    Operatorul de atribuire este şi el creat automat de către compilator dacă nu există unul declarat de utilizator.

    Destructorul este de asemenea creat de compilator în lipsa unuia declarat de utilizator. În plus, chiar dacă destructorul este declarat de către programator, el apelează automat destructorii pentru membrii clasei C şi pentru clasele din care derivă C imediat după terminarea corpului scris de programator.