Clase III Programarea calculatoarelor i limbaje de programare
Clase (III) Programarea calculatoarelor şi limbaje de programare II Capitolul 3
Introducere n Vom prezenta în acest capitol n modul în care se lucrează cu obiectele constante şi funcţiile membre const compunerea claselor n noţiunile de clase friend şi funcţii friend n pointerul this n modul în care obiectele pot fi create şi sterse dinamic n folosirea datelor şi funcţiilor membre statice n
Sumar n Obiecte constante şi funcţii membre const n Compunerea claselor: Obiecte ca membri ai claselor n Funcţii friend şi clase friend n Pointerul this n Alocarea dinamică a memoriei cu operatorii new şi delete n Membrii static ai claselor n Clase proxy - interfeţe
Obiecte constante şi funcţii membre const n Principiul restrângerii privilegiilor (principle of least privilege) este unul fundamental în ingineria software n Unele obiecte trebuie să fie modificabile, altele nu n Programatorul poate folosi cuvântul cheie const pentru a specifica faptul că un obiect nu poate fi modificat n Exemplu const Time noon(12, 0, 0);
Obiecte constante şi funcţii membre const n Compilatoarele C++ permit funcţiilor membre să apeleze obiecte const doar dacă ele însele sunt declarate de asemenea const n Această regulă este valabilă inclusiv pentru funcţii get care nu modifică obiectul n Funcţiile membre declarate const nu pot modifica obiectul n Exemplu n Funcţia get. Hour nu modifică obiectul şi este declarată const int Time: : get. Hour() const { return hour};
Obiecte constante şi funcţii membre const n Constructorii şi destructorii nu pot fi declaraţi const n Folosirea obiectelor, a funcţiilor membre şi a datelor membre const este crucială pentru o proiectare corectă a claselor şi a programelor n pentru codare – compilatoarele fac optimizări asupra constantelor n
Obiecte constante şi funcţii membre const n Exemplu class Time { public: Time(int = 0, int = 0); void set. Time(int, int); . . . int get. Hour() const; . . . void print. Short() const; void print. Long (); //ar trebui declarata tot const private: int hour; int minute; int second; };
Obiecte constante şi funcţii membre const int Time: : get. Hour() const { return hour; } void Time: : print. Short() const { cout << (hour < 10 ? "0" : "") << hour << ": " << (minute < 10 ? "0" : "") << minute; }
Obiecte constante şi funcţii membre const int main() { Time wake. Up(6, 45, 0); //obiect non-const Time noon(12, 0, 0); //obiect constant //FUNCTIE MEMBRA OBIECT wake. Up. set. Hour(18); //non-const //EROARE: noon. set. Hour(12); //non-const wake. Up. get. Hour(); noon. get. Minute(); //const non-const //EROARE: noon. print. Long(); //non-const return 0; }
Obiecte constante şi funcţii membre const n Obiectele const nu pot fi modificate prin asignare ele trebuie iniţializate n în definiţia constructorului clasei se adaugă o listă de iniţializare a membrilor n
Obiecte constante şi funcţii membre const n Exemplu class Increment { public: Increment(int c = 0, int i = 1); private: Data membră increment va int count; fi iniţializată cu valoarea i const increment; }; Increment: : Increment(int c, int i) : increment(i) { count = c; }
Obiecte constante şi funcţii membre const n Lista de iniţializare a membrilor se foloseşte pentru n n n Datele membre const – obligatoriu Obiectele membre ale unei clase În cazul claselor derivate, partea care provine din clasa de bază trebuie iniţializată tot prin lista de iniţializare n Exemplu O variantă greşită a constructorului: Increment: : Increment(int c, int i) { Eroare: count =c; Valoarea datei membre const increment = i; nu poate fi modificată prin } n asignare
Sumar n Obiecte constante şi funcţii membre const n Compunerea claselor: Obiecte ca membri ai claselor n Funcţii friend şi clase friend n Pointerul this n Alocarea dinamică a memoriei cu operatorii new şi delete n Membrii static ai claselor n Clase proxy - interfeţe
Compunerea claselor: Obiecte ca membri ai claselor n Exemplu de compunere a claselor n Dacă am scrie un program pentru un ceas cu alarmă, un obiect al clasei Alarm. Clock ar trebui să „ştie” când trebuie să declanşeze alarma n O idee de proiectare a acestei clase ar fi includerea unui obiect Time ca membru al său n O clasă poate conţine ca membri obiecte altor clase
Compunerea claselor: Obiecte ca membri ai claselor n Exemplu n Clasa Employee conţine două obiecte tip Date n Obiectele clasei Employee păstrează următoarele informaţii despre angajaţii unei firme: numele, prenumele, data naşterii şi data angajării n Datele membre birth. Date şi hire. Date sunt obiecte const ale clasei Date n Conţin, la rândul lor, datele membre month, day şi year
Compunerea claselor: Obiecte ca membri ai claselor class Date { public: Date(int = 1, int = 1990); void print() const; ~Date(); private: int day; //1 -12 int month; //1 -31 int year; int check. Day(int); };
Compunerea claselor: Obiecte ca membri ai claselor class Employee { public: Employee(char*, int, int, int); void print() const; ~Employee(); private: char first. Name[25]; char last. Name[25]; birth. Date şi hire. Date sunt const Date birth. Date; obiecte ale clasei Date const Date hire. Date; };
Compunerea claselor: Obiecte ca membri ai claselor Employee: : Employee(char* fname, char*lname, int bday, int bmonth, int byear, int hday, int hmonth, int hyear) : birth. Date(bday, bmonth, byear), Argumentele bday, hire. Date(hday, hmonth, hyear) bmonth şi byear sunt { transmise int length = strlen(fname); constructorului length = (length < 25 ? length : 24); obiectului birth. Date strncpy( first. Name, fname, length); first. Name[length] = '