Anda di halaman 1dari 22

ClassieoggettiinC++

Prof.CAPOBIANCOIng.Nicol

ClassiedoggettiinC++1
IlC++sidistinguedaCinquantounlinguaggioorientatoaglioggetti (objectoriented). Gli oggetti in C++ sono analoghi agli oggetti del mondo reale, come macchine, motociclette, biciclette: hanno uno statoeduncomportamento. UnoggettoinC++contieneattributiemetodi. I primi sono variabili interne che permettono all'oggetto di memorizzareleinformazioni(lostatodell'oggetto). I metodi sono funzioni interne all'oggetto che descrivono cosa esso possafare. Gliattributicostituisconoilnucleodell'oggettoevengonocircondatie nascosti dai metodi (funzioni). Questo metodo viene chiamato incapsulamentodelleinformazioni. Lo scopo di non mostrare all'utilizzatore i dettagli dell'oggetto che nonsonoimportantidalpuntodivistadell'utilizzo. Nellavitarealelastessacosa.

ClassiedoggettiinC++2
Infatti, per guidare una moto non necessario conoscerecomecostruita. Anche se un meccanico cambia parte del motore un motociclistacontinuaaguidarlaregolarmente. Analogamente, gli oggetti C++ permettono al programmatore di cambiare la parte nascosta del progetto senza dover modificare altre parti del programma. Ovviamente, la parte visibile dell'oggetto (il suo comportamento)nondevecambiare.

ClassiedoggettiinC++3
Una classe si definisce con la parola chiave class. Per esempio, la definizionediunaclassedinomeMotopuesserelaseguente: classMoto{ intaccesa; doublevelocita; }; Motom; Questaclassehadueattributi:accesaevelocita. AbbiamoanchedichiaratounavariabiledinomemeditipoMoto. Lavariabilemunoggetto,mentreMotounaclasse. Alorovoltaanchegliattributipossonoesseredeglioggetti. Pensiamo ad una classe PUNTO con due coordinate ed una classe SEGMENTOcheusacomeattributilaclassePUNTO.

ClassiedoggettiinC++4
Gliattributidiunoggetto,alcontrariodiunastruct,nonpossonoessere normalmente accessibili dall'esterno, ma possono essere utilizzati solodaimetodidell'oggetto.Peresempio,l'istruzionem.velocita=200 non corretta perch l'attributo velocit non accessibile dall'esterno;sidicecheprivato. Perrenderepubblicounattributo,sideveusarelaparolachiavepublic. classMoto{ intaccesa; public: doublevelocita; }; Cos,possousarel'istruzionem.velocita=200 Se voglio rendere privati degli attributi, mettiamo la parola chiave private.

ClassiedoggettiinC++5
classMoto{ intaccesa; doublevelocita; public: voidaccendi() { accesa=1; } voidaccelera(doublex) { velocita=velocita+x; } doublea_quanto_vado() { returnvelocita; } };

Una classe, come detto, pu contenere dei metodi, che normalmente sonoprivati.Perrenderlipubblicisufficientemetterepublic: EsempiodellaclasseMoto.

ClassiedoggettiinC++6
Per eseguire un metodo, si usa una sintassi simile a quella di una struttura: m.accelera(10);//aumentadi10ilvaloredell'attributovelocita cout << m.a_quanto_vado(); // mostra su video il contenuto dell'attributovelocita. Gliattributidiunaclassesonovisibiliall'internodituttiimetodidella classe, mentre le variabili locali di un metodo sono visibili solo all'internodelmetodo. Pu succedere che un metodo di una classe possa richiamare un metododiun'altraclasse. Esempio:

ClassiedoggettiinC++7
classPunto{ doublex; doubley; public: voidtrasla(doubledx,doubledy)//metodochepermetteditraslarelecoordinate. { x=x+dx; y=y+dy; } }; classSegmento{ Puntoa; Puntob; public: voidtrasla(doubledx,doubledy)//permetteditraslareiverticidelsegmento { a.trasla(dx);//laclassesiservedelmetodotrasladellaclassepunto. b.trasla(dy); } }; SegmentoS; s.trasla(7,88);

ClassiedoggettiinC++8
Fino ad ora, il codice dei metodi era interno alla definizione della classe. Ottimo, ma poco pratico. Infatti,seilmetodocomplessoavrmoltelineedi codice e ci render praticamente illegibile la definizionedellaclasse. Il C++ permette di definire l'implementazione di un metodo al di fuori della classe, mantenendo all'internodellaclassesoloiprototipideimetodi. Vediamocomesifaconl'esempiodelleclassiPunto eSegmento.

ClassiedoggettiinC++9
classPunto{ doublex; doubley; public: voidtrasla(doubledx,doubledy);//prototipodelmetodo };//terminaladichiarazionedellaclasse voidPunto::trasla(doubledx,doubledy) { x=x+dx; y=y+dy; } classSegmento{ Puntoa; Puntob; public: voidtrasla(doubledx,doubledy); }; voidSegmento::trasla(doubledx,doubledy) { a.trasla(dx);//laclassesiservedelmetodotrasladellaclassepunto. b.trasla(dy); };

ClassiedoggettiinC++10
All'interno di una classe possono esserci pi metodi con lo stesso nome,madevonoaverediversiilnumeroe/oiltipodeiparametri(non sufficienteaverediversoiltipocheritorna).Questapossibilitviene chiamataoverloadingdeimetodi. E' possibile per una classe specificare uno o pi costruttori. E' un metodo che ha lo stesso nome della classe e che ha lo scopo di inializzaregliattributidellaclasse. Viene chiamato, al contrario degli altri metodi, automaticamente quandounoggettovienedefinitoocreato. Peressinondeveessereindicatoiltipodelrisultato. Comeglialtrimetodi,icostruttoripossonoesserepidiunograzieal meccanismo di overloading. In questo caso si distinguono per il numeroe/otipodiparametridiversi. Ilcostruttoresenzaparametrivienedettocostruttoredidefault.

ClassiedoggettiinC++11
classMoto{ intaccesa; doublevelocita; public: Moto();//questoilcostruttoredidefault Moto(doublev);//unaltrocostruttore } Moto::Moto()//questoilcostruttoredidefault } accesa=0; velocita=0; } Moto::Moto(doublev)//l'altrocostruttore { accesa=0; velocita=v; } Motom;//chiamiamoilcostruttoredidefault Motom1(70.0);//chiamataalsecondocostruttore

ClassiedoggettiinC++12
Oltreaicostruttoripossibilespecificareancheundistruttore. E' un metodo particolare che esegue alcune operazioni prima che un oggettovengadistrutto. Un oggetto di una classe pu essere distrutto o cancellato in due diversesituazioni: sel'oggettostatoallocatodinamicamenteconl'istruzionenew,poi puesseredeallocatoecancellatocondelete.(vediamodopo) sel'oggettolocaleadunafunzione,essovienecancellatoquandola funzionehatermine. Il distruttore un metodoparticolare conlostessonomedellaclasse, senzaparametriedprecedutodalsimbolo~. Il distruttore viene sempre chiamato automaticamente quando un oggettovienecancellatodallamemoriadiuncomputer. Ancheperildistruttorenondeveessereindicatoiltipodelrisultato. Ildistruttoreunico,nonammettequindioverloading.

ClassiedoggettiinC++13
classMoto{ intaccesa; doublevelocita; public: Moto();//questoilcostruttoredidefault ~Moto();//ildistruttore voidaccelera(doublex); } Moto::Moto()//questoilcostruttoredidefault } accesa=0; velocita=0; } Moto::~Moto();//distruttore { cout<<velocita; } voidMoto::accelera(doublex) { velocita=velocita+x; } voidprova() { Motom;//chiamailcostruttore m.accelera(15);//chiamaildistruttore. } voidmain() { prova(); }

ClassiedoggettiinC++14

Icostruttorieidistruttonisonoparticolarmenteimportantiquandouno o pi attributi sono puntatori a zone di memoria allocatati dinamicamente. Ancheglioggetti,cometuttelevariabiliinC++,possonoesserecreati dinamicamente: Moto*m=newMoto(); Questaallocazionepuessereanchefattainuntemposuccessivo. Un oggetto creato dinamicamente, quando non serve pi, viene de allocatoconl'istruzione: deletem; Questa istruzione, primadiliberare lamemoriaoccupatadall'oggetto, chiamailsuodistruttore. E' possibile allocato un vettore di oggetti. Ma quando bisogna de allocare,necessariospecificarechesitrattadiunvettoredioggetti: delete[]m; altrimentinonvengonochiamatiidistruttorideglioggettidelvettore.

PolimorfismoedEreditarietinC++1

L'ereditariet una caratteristica propria dei linguaggi ad oggetti che permettedicreareclassifigliediunaclassegenitore. Una classe figlia pu utilizzare (eredita) sia gli attributi sia i metodi della classe genitore, ed in pi pu anche avere degli attributi e/o metodiproprichelaclassegenitorenonpuutilizzare. Questo meccanismo si pu ripetere, pertanto una classe figlia pu, a sua volta, essere una classe genitore di altre classi figlie costruendo cosunalberodiereditariet. Comepossibileaverepiclassifigliedaunaclassegenitore,anche possibile che una classe figlia provenga da pi classi genitori (ereditarietmultipla). Per semplicit si far sempre riferimento ad una ereditariet singola, ossiaunsologenitoreperfiglio). La regola pratica da seguire per la costruzione di un albero di ereditarietdicecheseunoggettoAancheunoggettoB,allorala classeAereditadallaclasseB.Vediamounesempio:

classgenitore{ intx1; public: intx2; }; classfiglio:genitore{ inty1; public: inty2; voidprova(); }; voidfiglio::prova() { y1=1; y2=2; x2=3;//nonsipuusarex1,perchditipoprivatoecontinuaadesserloanche perilfiglio. } genitorex; figlioy;

PolimorfismoedEreditarietinC++2

PolimorfismoedEreditarietinC++3

Unaclassehaaccessosoloaimetodieattributidellaclassegenitorechenonsonodi tipoprivato. Gli attributi della classe genitore, quando ereditati, possono modificare le regole di visibilit. Riferendociall'esempioprecedente,x2vieneereditatoperchinizialmentepubblico. La classe figlia lo usa (per esempio nel metodo prova()) ma l'attributo non pi visibile all'esterno della classe. Pertanto, l'istruzione y.x2 = 200 non corretta; mentrelosonoleistruzioniy.y2=200ex.x2=150. Ingenerale,laregolastabiliscechegliattributi,unavoltaereditati,diventanoprivati. Permodificarequestaregola,siutilizzal'istruzionepublic: classfiglio:publicgenitore{ Costuttigliattributieimedotidellaclassegenitoremantengonolestesseregoledi visibilit.Inquestomodo,l'istruzioney.x2=200corretta. Cinontogliecheunattributoprivatodelgenitorecontinuaarestaretale;l'istruzione y.x1=200continuaanonesserecorretta. Quandoleclassiereditano,puessereutileusareoltreaprivateepublicunaregoladi visibilit intermedia detta protected. I metodi e gli attributi protected sono visti solamentenellaclassedovesonodefinitieanchenelleclassifiglie,mamaiinaltri puntidelprogramma.Esempio:

PolimorfismoedEreditarietinC++4
classgenitore{ intx1; protected: intx2; }; classfiglio:publicgenitore{ inty1; public: inty2; voidprova(); }; voidfiglio::prova() { y1=1; y2=2; x2=3; } genitorex; figlioy;

PolimorfismoedEreditarietinC++5
Ci comporta che x2 = 3 contenuto nel metodo figlio::prova() continua ad essere corretto; mentre non lo una istruzione del genere: x.x2=20 perch x2 essendo protectednonvisibilealdifuoridelleclassigenitoreefiglie. Ricordiamoche: le istruzioni private, protected e public hanno validit fino a quando si incontra un'altraistruzionedivisibilit; normalmente,senonspecificatodiversamente,tuttigliattributiedimetodisonodi tipoprivate; le classi figlie oltre ad aggiungere metodi ed attributi nuovi ed usare quelli della classe genitore da dove provengono, possono anche modificare le regole di visibilitdeimetodiedegliattributiereditati;

PolimorfismoedEreditarietinC++6
Una classe figlia pu ridefinire i metodi e gli attributi delle classi genitori modificandoli opportunamente. Questo meccanismo di overriding maschera il metodooriginaleepuessereapplicatosiaaimetodisiaagliattributi. L'overriding dei metodi e degli attributi pu causare delle difficolt quando dalla classefigliasivuoleaccedereaimetodioattributimascheratinellaclassegenitori. L'overridingdeicostruttorisegueregoleunpocodiverse: avviene non tra funzioni con lo stesso nome e con gli stessi argomenti, ma semplicementetracostruttoriconglistessiargomenti; nel caso in cui si esegua l'overriding di un costruttore, il costruttore della classe figliachenemascheradellaclassegenitoredeveesplicitamenterichiamareunodei costruttoridellaclassegenitore. infine,lasintassiconcuiilcostruttoredellaclassefigliachiamailcostruttoredella classegenitorediversadallasintassidichiamatadeimetodi.

PolimorfismoedEreditarietinC++7

Il poliformismo la capacit che ha un oggetto di una certa classe di contenere un oggettodiunaclassediversa,purchfigliadellaprimaclasse. Questopossibileperchunoggettofigliocomeunoggettogenitore. Ilpoliformismopupresentaredeiproblemiseusatoinsiemeall'overriding.

Anda mungkin juga menyukai