Scaricare la presentazione
La presentazione è in caricamento. Aspetta per favore
PubblicatoElma Coppola Modificato 9 anni fa
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); }
Presentazioni simili
© 2024 SlidePlayer.it Inc.
All rights reserved.