La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti statici e dinamici. Classi annidate. Costruttori/distruttori.

Presentazioni simili


Presentazione sul tema: "Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti statici e dinamici. Classi annidate. Costruttori/distruttori."— Transcript della presentazione:

1 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti statici e dinamici. Classi annidate. Costruttori/distruttori.

2 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Costruttori/distruttori Quando un oggetto viene allocato viene eseguita una routine di inizializzazione: il costruttore. Quando viene deallocato si esegue un distruttore

3 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Necessità di un cotruttore Ratio::Ratio(int n, int d) { Assign(n, d); } void Ratio::Assign (int n, int d) { if (d != 0) {num = n, den = d;} else cout << "divisione per 0" << endl; } Il costruttore mantiene l’invariante “il denominatore è sempre  0”

4 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Costruttori e oggetti statici class Ratio { public: Ratio (int n=0, int d=1) { num = n; den = d;} private:... }; default Ratio a (7, 4); // a vale 7/4 Ratio b (7); // b vale 7/1 Ratio c; // c vale 0/1 costruttore

5 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti e valori Un oggetto può essere il valore di una funzione o di un metodo Ratio Ratio::Sum (Ratio r) { Ratio q (num*r.den+den*r.num,den*r.den); return q; } Già l’ANSI-C consente di ritornare strutture

6 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Costruttore di copia class Ratio { public: Ratio (int n=0, int d=1) { num = n; den = d;} Ratio (const Ratio& r) { num = r.num; den = r.den;} private:... }; Ratio a (2,3); Ratio b(a); // b è un clone di a Per ritornare un oggetto una funzione usa il costruttore di copia Costruttore di copia

7 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Polinomi class Polinomio { public: Polinomio (int degree, double c[]); // Pre: c[] ha dimensione >= degree + 1 // Post: genera il polinomio di grado degree e // coefficienti c[0..degree] (in ordine decr. di grado) Polinomio (const Polinomio& p); // costr. di copia ~Polinomio (); // distruttore...

8 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Polinomi Questo si otterrebbe usando il costruttore di copia di default Polinomio q (p);

9 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Polinomi Polinomio::Polinomio (const Polinomio& p) { degree = p.degree; coeff = new double[degree + 1]; for (int i = 0; i < degree + 1; i++) coeff[i] = p.coeff[i]; } Polinomio q (p); p q

10 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Puntatori ad oggetti Gli oggetti sono valori, e possono essere il riferimento di puntatori Ratio a (2, 3); Ratio* p = &a; p->print() // attiva il metodo // print() di a

11 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Istanziazione dinamica di classi Quanti razionali mi servono? Ratio* p = new Ratio(2, 3); // p punta ad un nuovo oggetto // che vale 2/3 allocazione

12 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Puntatori per risparmiare Polinomio Polinomio::Sum (Polinomio p) {…} Polinomio Polinomio::Sum (Polinomio* p) {…} La prima scrittura causa la produzione di una copia di p; ma la seconda può causare side effects su p

13 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Classi annidate Una classe può essere usata come campo di un’altra: si dice annidata e il processo di annidamento si dice composizione class Polinomio { public:... private: int degree; // grado del polinomio Ratio* coeff; // vettore di coefficienti razionali }

14 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Funzioni e classi friend

15 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Le liste con le classi List ListEl

16 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Le liste con le classi class ListEl; typedef ListEl *PListEl; class ListEl { friend class List; private: T info; PListEl next; ListEl (T x, PListEl nxt) { info = x; next = nxt;} }; La classe List è friend di ListEl : i suoi metodi avranno accesso ai campi privati di ListEl Il costruttore privato consente l’uso della classe solo alla classe friend

17 Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Le liste con le classi class List { public: void insert (T x); // inserimento in testa void insert (int index, T x); // overloading: inserimento con indice bool empty (void) { return first == NULL;} //... private: PListEl first; // puntatore al primo el. }; void List::insert (T x) { first = new ListEl(x, first); }


Scaricare ppt "Ugo de'Liguoro - Informatica 2 a.a. 03/04 Lez. 8 Oggetti statici e dinamici. Classi annidate. Costruttori/distruttori."

Presentazioni simili


Annunci Google