Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11...
Transcript of Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11...
C++ - Le classi 1
Informatica 1 Le classi nel C++
C++ - Le classi 2
Definizioni
Una classe è un metodo logico per organizzare dati e funzioni nella stessa struttura.Differenze class e structPermission_label può essere private: public: oppure protectedVedere esempio rectangle
class class_name {permission_label_1:
member1;permission_label_2:
member2;...
} object_name;
C++ - Le classi 3
Permessi
Componenti private sono accessibili solo da altri componenti della classe o da classi friendComponenti protected sono accessibili da altri componenti della classe, da classi friend,o da classi derivedComponenti public sono accessibili da tutti i componenti che hanno visibilità della classe
C++ - Le classi 4
#include <iostream.h>class CRectangle {int x, y;Public:void set_values (int,int);int area (void) {return (x*y);}
};void CRectangle::set_values (int a, int b) {x = a;y = b;
}int main () {CRectangle rect, rectb;rect.set_values (3,4);rectb.set_values (5,6);cout << "rect area: " << rect.area() << endl;cout << "rectb area: " << rectb.area() << endl;
}
Operatore di scope
Accedono alle variabili private
Oggetti di classe Crectangle
C++ - Le classi 5
Ogni oggetto della classe ha le proprie variabili e le proprie funzioni…
La programmazione e progettazione OO si basa su questo concetto, ovvero dati e funzioni sono proprietà dell’oggetto invece della visione standard di funzioni e parametri della programmazione strutturata.
C++ - Le classi 6
Costruttori
Cosa potrebbe accadere se nell’esempio chiamassimo la funzione area() prima di set_values?Caso indefinito perché l’oggetto non ha dimensioni.Per evitare questo ci sono i costruttori ovvero funzioni con lo stesso nome della classe e che vengono chiamati automaticamente quando viene creata una nuova istanza della classe.
C++ - Le classi 7
#include <iostream.h>class CRectangle {int width, height;public:CRectangle (int,int);int area (void) {return (width*height);}
};CRectangle::CRectangle (int a, int b) {width = a;height = b;
}int main () {CRectangle rect (3,4);CRectangle rectb (5,6);cout << "rect area: " << rect.area() << endl;cout << "rectb area: " << rectb.area() << endl;
}
Costruttore: non restituisce alcun valore.
Il costruttore è chiamato automaticamente quando viene creata una nuova istanza della classe
C++ - Le classi 8
Distruttore
Il distruttore realizza la funzionalità opposta ed è chiamato automaticamente quando un oggetto è rilasciato (quando finisce il suo scope oppure quando è rilasciato usando delete)
scope = ambiente di validità
C++ - Le classi 9
Distruttore
Il distruttore ha lo stesso nome della classe preceduto da tilde (~)Non restituisce alcun valoreE’ utile quando l’istanza creata alloca memoria e al momento della sua distruzione la deve rilasciare.Esempio crectangle
C++ - Le classi 10
#include <iostream.h>class CRectangle {int *width, *height;public:CRectangle (int,int);~CRectangle ();int area (void) {return (*width * *height);}
};CRectangle::CRectangle (int a, int b) {width = new int;height = new int;*width = a;*height = b;
}CRectangle::~CRectangle () {delete width;delete height;
}int main () {CRectangle rect (3,4), rectb (5,6);cout << "rect area: " << rect.area() << endl;cout << "rectb area: " << rectb.area() << endl;return 0;
}
Il costruttore alloca memoria
Il distruttore la rilascia
C++ - Le classi 11
Overloading di costruttori
Il costruttore può essere “sovraccaricato” come tutte le altre funzioni con funzioni che hanno lo stesso nome e differente numero o tipi di parametriNel caso non vengano specificati costruttori il compilatore fornisce due costruttori overloaded: il default constructor e il copy constructorQuando forniamo costruttori, i due predefiniti vengono sostituiti da quelli forniti.
C++ - Le classi 12
class CExample {public:
int a,b,c;void multiply (int n, int m) { a=n; b=m; c=a*b; };
};
// default constructor implicito
CExample::CExample () { };
// copy constructor implicito
CExample::CExample (const CExample& rv) {a=rv.a; b=rv.b; c=rv.c;
}
C++ - Le classi 13
#include <iostream.h>class CRectangle {int width, height;public:
CRectangle ();CRectangle (int,int);int area (void) {return (width*height);}
};CRectangle::CRectangle () {width = 5;height = 5;
}CRectangle::CRectangle (int a, int b) {width = a;height = b;
}int main () {CRectangle rect (3,4);CRectangle rectb;cout << "rect area: " << rect.area() << endl;cout << "rectb area: " << rectb.area() << endl;
}
Se non ci sono parametri non vanno specificate le parentesi!!
C++ - Le classi 14
#include <iostream.h>class CRectangle {int width, height;public:
void set_values (int, int);int area (void) {return (width * height);}
};void CRectangle::set_values (int a, int b) {width = a;height = b;
}int main () {CRectangle a, *b, *c;CRectangle * d = new CRectangle[2];b= new CRectangle;c= &a;a.set_values (1,2);b->set_values (3,4);d->set_values (5,6);d[1].set_values (7,8);cout << "a area: " << a.area() << endl;cout << "*b area: " << b->area() << endl;cout << "*c area: " << c->area() << endl;cout << "d[0] area: " << d[0].area() << endl;cout << "d[1] area: " << d[1].area() << endl;return 0;
}
Puntatori alle classi
C++ - Le classi 15
Classi definite come structIl C++ estende alla parola chiave struct del C le stesse funzionalità della parola chiave class tranne per il fatto che tutti i membri della struttura sono per default public invece di privateLa convenzione implicita è di usare le struct per strutture contenenti solo dati e class nell’altro caso.
C++ - Le classi 16
Overloading
E’ possibile l’overload di tutti gli operatori del C++, in particolare:
+ - * / = < > += -= *= /= << >><<= >>= == != <= >= ++ -- % & ^ ! |~ &= ^= |= && || %= [] () new delete
C++ - Le classi 17
Overloading
Per fare l’overload di un operatore è necessario scrivere una funzione membro il cui nome è operator seguito dal simbolo dell’operatore:type operator sign (parameters);
C++ - Le classi 18
// vectors: overloading operators example#include <iostream.hclass CVector {public:
int x,y;CVector () {};CVector (int,int);CVector operator + (CVector);
};CVector::CVector (int a, int b) {x = a;y = b;
}CVector CVector::operator+ (CVector param) {CVector temp;temp.x = x + param.x;temp.y = y + param.y;return (temp);
}int main () {CVector a (3,1);CVector b (1,2);CVector c;c = a + b;cout << c.x << "," << c.y;return 0;
}
Default constructor necessario perché è stato inserito almeno un costruttore. Nota che i costruttori dovrebbero almento inizializzare le variabili
Overloading del + che fa la somma di array
Uso del +
C++ - Le classi 19
Overloading (=)
L’operatore = (assegnamento) è definito per default in ogni classe e permette di copiare il contenuto del parametro alla destra dell’assegnamento nel lvalue a sinistra.Può essere ridefinito dall’utente.
C++ - Le classi 20
this#include <iostream.h>class CDummy {public:
int isitme (CDummy& param);};int CDummy::isitme (CDummy& param){if (¶m == this) return 1;else return 0;
}int main () {CDummy a;CDummy* b = &a;if ( b->isitme(a) )
cout << "yes, &a is b";return 0;
}
La parola chiave this all’interno di una classe rappresenta l’indirizzo in memoria dell’oggetto della classe: è un puntatore.
C++ - Le classi 21
componenti statiche// static members in classes#include <iostream.h>class CDummy {
public:static int n;CDummy () { n++; };~CDummy () { n--; };
};int CDummy::n=0;int main () {
CDummy a;CDummy b[5];CDummy * c = new CDummy;cout << a.n << endl;delete c;cout << CDummy::n << endl;return 0;
}
Una classe può contenere componenti statiche, ovvero che non dipendono dall’istanzaNell’esempio n serve per contare il numero di oggetti istanziatin ha scope globale ed è definito (inizializzato) nello scope globale, mentre è dichiarato all’interno della classe.Vedere esempio staticvar
C++ - Le classi 22
Le funzioni friend
Una funzione friend esterna ad una classe può accedere ai componenti private e protected della classe.Per permettere l’accesso da parte di una funzione friend è necessario dichiarare il prototipo della funzione esterna che deve accedere agli elementi della classe preceduta dalla parola chiave friend all’interno della dichiarazione della classe che mette a disposizione le proprie componenti.L’uso delle funzioni friend non è conforme alla metodologia OO
C++ - Le classi 23
// friend functions#include <iostream.h>class CRectangle {int width, height;public:
void set_values (int, int);int area (void) {return (width * height);}friend CRectangle duplicate (CRectangle);
};void CRectangle::set_values (int a, int b) {width = a;height = b;
}CRectangle duplicate (CRectangle rectparam){CRectangle rectres;rectres.width = rectparam.width*2;rectres.height = rectparam.height*2;return (rectres);
}int main () {CRectangle rect, rectb;rect.set_values (2,3);rectb = duplicate (rect);cout << rectb.area();
}
Dichiarazione del template della funzione friend
Dichiarazione della funzione friend
Uso della funzione
C++ - Le classi 24
Classi friend
Una classe friend può accedere ai componenti private e protected di una classe.
C++ - Le classi 25
// friend class#include <iostream.h>class CSquare;class CRectangle {int width, height;public:int area (void){return (width * height);}
void convert (CSquare a);};class CSquare {private:int side;public:void set_side (int a){side=a;}friend class CRectangle;
};void CRectangle::convert (CSquare a) {width = a.side;height = a.side;
}int main () {CSquare sqr;CRectangle rect;sqr.set_side(4);rect.convert(sqr);cout << rect.area();return 0;
}
La classe CSquare è dichiarata friend di CRectangle in questo modo la funzione convert di CRectangle può accedere al dato privato a.side: con la dichiarazione friend CSquare mette a disposizione i propri dati privati/protectedNon è vero il contrario: CSquare non può accedere ai dati privati di CRectangle