Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11...

25
C++ - Le classi 1 Informatica 1 Le classi nel C++

Transcript of Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11...

Page 1: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

C++ - Le classi 1

Informatica 1 Le classi nel C++

Page 2: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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;

Page 3: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 4: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 5: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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.

Page 6: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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.

Page 7: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 8: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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à

Page 9: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 10: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 11: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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.

Page 12: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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;

}

Page 13: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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!!

Page 14: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 15: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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.

Page 16: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

C++ - Le classi 16

Overloading

E’ possibile l’overload di tutti gli operatori del C++, in particolare:

+ - * / = < > += -= *= /= << >><<= >>= == != <= >= ++ -- % & ^ ! |~ &= ^= |= && || %= [] () new delete

Page 17: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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);

Page 18: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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 +

Page 19: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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.

Page 20: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

C++ - Le classi 20

this#include <iostream.h>class CDummy {public:

int isitme (CDummy& param);};int CDummy::isitme (CDummy& param){if (&param == 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.

Page 21: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 22: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 23: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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

Page 24: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

C++ - Le classi 24

Classi friend

Una classe friend può accedere ai componenti private e protected di una classe.

Page 25: Informatica 1 Le classi nel C++web.tiscali.it/adinfo/lezioni/8-Classi v1.pdf · C++ - Le classi 11 Overloading di costruttori ÆIl costruttore può essere “sovraccaricato” come

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