MODIFICATORUL CONST PENTRU OBIECTE sl FUNCŢII MEMBRU
Īn capitolul 20 s-au indicat facilitatile oferite de modificatorul const la declararea datelor constante.
Īn principiu, modificatorul const prezent īntr-o declaratie, protejeaza data din declaratia respectiva deoarece ei nu i se poate schimba valoarea la executie īn mod "direct". De aceea, ea se comporta 353j99d la fel ca o constanta.
Modificatorul const se poate aplica si la declararea obiectelor pentru a instantia obiecte constante sau pointeri spre obiecte constante.
Exemplu:
Fie clasa sir, definita ca mai jos:
class sir ;
Parametrul constructorului de copiere este o referinta la un obiect. Acest obiect constituie obiectul sursa care se copiaza īn obiectul curent.
Constructorul de copiere nu are voie sa modifice obiectul sursa. Acest lucru este asigurat folosind modificatorul const la declararea parametrului formal.
Modificatorul const are aceeasi utilizare si īn cazul functiei care supraīncarca operatorul "=". Īntr-adevar, obiectul parametru reprezinta partea dreapta a operatorului de atribuire. Functia respectiva nu are voie sa modifice operatorul din dreapta semnului de atribuire si de aceea, parametrul corespunzator lui se declara folosind modificatorul const.
Functiile membru ale clasei sir se pot defini la fel ca īn exercitiul 23.14. Fie instantierile:
const sir s1("C++ este un C mai bun");
const sir s2=s1;
sir s3;
La prima instantiere se aplica constructorul care are ca parametru un pointer spre un sir de caractere (char *). La instantierea a doua se aplica constructorul de copiere. La instantierea a treia se aplica constructorul implicit.
O atribuire de forma:
s3=s1;
este corecta. La realizarea ei se apeleaza functia care supraīncarca operatorul de atribuire, īn schimb, la o atribuire de forma:
s1=s3;
compilatorul afiseaza un avertisment deoarece s1 a fost declarat cu ajutorul modificatorului const.
Modificatorul const se poate utiliza īn antetul unei functii īn doua moduri.
O prima utilizare a modificatorului const este aceea de a proteja obiectul returnat de functie, īn acest caz, modificatorul const precede tipul din antetul sau prototipul functiei respective:
(1)... const tip nume_clasa::numefunctie(...)
Cea de a doua utilizare a modificatorului const este aceea cānd acesta se afla īn antetul sau prototipul functiei dupa paranteza īnchisa care termina lista parametrilor formali ai functiei:
(2) ... nume_clasa::nume_functie(...) const
O astfel de functie nu poate modifica datele membru ale obiectului pentru care se apeleaza (obiectul curent).
Īn exemplul de mai sus, functia afsir este o functie care nu trebuie sa modifice obiectul pentru care se apeleaza. De aceea, ea se poate defini utilizānd modificatorul const:
void afsir(char *f) const;
O functie care are antetul de forma (2) o vom numi functie const.
La apelul functiei care nu este functie const, pentru un obiect instantiat cu ajutorul modificatorului const, compilatorul va emite un avertisment. Astfel, daca vom utiliza functia afsir pentru clasa sir fara a fi definita ca functie const, atunci la apelul:
s1.afsir() ;
compilatorul afiseaza un avertisment.
Daca modificam antetul si prototipul functiei afsir adaugānd modificatorul const dupa paranteza īnchisa:
void sir::afsir() const
atunci la apelul functiei afsir nu se va mai afisa avertismentul respectiv.
Se recomanda ca toate functiile membru care nu modifica nici o data membru a obiectului curent, sa fie realizate ca functii const.
|