Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli

Programmazione ad oggetti in C++, Slide di Informatica

Concetto di oggetto, attributo e metodo nel linguaggio C++ e le principali caratteristiche delle classi

Tipologia: Slide

2019/2020
In offerta
30 Punti
Discount

Offerta a tempo limitato


Caricato il 10/12/2020

FedeNovi02
FedeNovi02 🇮🇹

4.2

(10)

18 documenti

Anteprima parziale del testo

Scarica Programmazione ad oggetti in C++ e più Slide in PDF di Informatica solo su Docsity! OOP OBJECT ORIENTED PROGRAMMING • Astrazione • 1980 necessità di riutilizzare il codice • Crisi dimensionale dei sistemi informatici • Crisi gestionale (costi per manutenzione) • Crisi qualitativa (strumenti non suff) • ISTANZA = entità particolare con le sue specifiche caratteristiche • CLASSE = rappresenta un modello per descrivere un insieme di oggetti. Essa specifica gli attributi, senza indicarne il valore, e i metodi #include <iostream> using namespace std; class Rettangolo {public: float base, altezza; float Area(){ return base*altezza;} }; int main() {Rettangolo figura1; figura1.base=10; figura1.altezza=8; cout << "L'area del rettangolo e' "<< figura1.Area() <<endl; return 0; } Definizione di una classe class NomeClasse // Identificatore valido { dichiarazioni dei dati // attributi definizione delle funzioni // metodi }; ha due parti: dichiarazione: descrive i dati e l'interfaccia (cioè le "funzioni membro", anche dette "metodi") definizioni dei metodi: descrive l'implementazione delle funzioni membro gli attributi sono variabili semplici (interi, strutture, array, float, ecc.) o complessi (oggetti istanze di altre classi) i metodi sono funzioni semplici che operano sugli attributi (dati) Oggetti definita una classe, possono essere generate istanze della classe, cioè oggetti nome_classe identificatore ; Rettangolo figura1 un oggetto sta alla sua classe come una variabile al suo tipo Rettangolo figura1; figura1.base=10; figura1.altezza=8; cout << "L'area del rettangolo e' "<< figura1.Area() <<endl; Attributi possono essere di qualunque tipo valido, con eccezione del tipo della classe che si sta definendo non è permesso inizializzare un membro dato di una classe all'atto della sua definizione; la seguente definizione di classe genera quindi errori: class C { private: int T = 0; // Errore const int CInt = 25; // Errore int& Dint = T // Errore // ... }; non avrebbe senso inizializzare un membro dato dentro la definizione della classe, perché essa indica semplicemente il tipo di ogni membro dato e non riserva realmente memoria; si deve invece inizializzare i membri dato ogni volta che si crea un'istanza specifica della classe mediante il costruttore della classe I metodi i metodi possono essere sia dichiarati che definiti all'interno delle classi; la definizione di un metodo consiste di quattro parti: • il tipo restituito dalla funzione • il nome della funzione • la lista dei parametri formali (eventualmente vuota) separati da virgole • il corpo della funzione racchiuso tra parentesi graffe le tre prime parti formano il prototipo della funzione che deve essere definito dentro la classe, mentre il corpo della funzione può essere definito altrove class Rettangolo {public: float base, altezza; float Area(){ return base*altezza;} }; Inserimento dei dati da tastiera #include <iostream> using namespace std; class Rettangolo {public: float base, altezza; float Area(float base, float altezza){ return base*altezza;} }; int main() {Rettangolo figura1; float b,h; cin>>b; cin>>h; cout << "L'area del rettangolo e' "<< figura1.Area(b,h) <<endl; return 0; } #include <iostream> using namespace std; class Rettangolo {public: float base, altezza; void Assegna(float b, float h){ base=b; altezza=h;} float Area(){ return base*altezza;} }; int main() {Rettangolo figura1; float b,h; cin>>b; cin>>h; figura1.Assegna(b,h); cout << "L'area del rettangolo e' "<< figura1.Area() <<endl; return 0; } class Rettangolo {public: float base, altezza; USO DI GET(recupera un valore) void setbase(float b){ E SET (imposta un valore) base=b;} void setaltezza(float h){ altezza=h;} float getbase(float b); float getaltezza(float h); }; float Rettangolo::getbase(float b){ return b;} float Rettangolo::getaltezza(float h){ return h;} Esercizi • Creare una classe Atleta per rappresentare le informazioni di un giocatore • Aggiungere alla classe precedente un metodo per assegnare all’atleta il nome della squadra dove gioca • Creare una classe CD per le informazioni su un disco musicale e i metodi per aggiornare il prezzo • Creare una classe che permetta di svolgere le quattro operazioni ricevendo in input due frazioni Distruttore si può definire anche una funzione membro speciale nota come distruttore, che viene chiamata automaticamente quando si distrugge un oggetto il distruttore ha lo stesso nome della sua classe preceduto dal carattere ~ neanche il distruttore ha tipo di ritorno ma, al contrario del costruttore, non accetta parametri e non ve ne può essere più d'uno class Demo { private: int dati; public: Demo() {dati = 0;} // costruttore ~Demo() {}; // distruttore }; serve normalmente per liberare la memoria assegnata dal costruttore se non si dichiara esplicitamente un distruttore, C++ ne crea automaticamente uno vuoto Esercizi 1. Creare una classe conto e un costruttore che assegni il valore iniziale 0 al suo saldo 2. Creare la classe orologio con le ore, minuti, secondi. I metodi della classe consentono di azzerare l’orario, correggere l’ora, leggere l’orario completo con ore, minuti e secondi 3. Il computer di bordo di un’automobile è in grado di calcolare il consumo medio conoscendo i km percorsi e i litri di carburante consumati. Definire la classe automobile con il metodo per il calcolo oltre al costruttore per inizializzare gli attributi 4. Definire la classe libro con gli attributi: titolo, autore, anno, città, editore e soggetto. Implementare i metodi per inserire e visualizzare i dati dei libri, aggiungendo anche un costruttore e un distruttore Poliformismo: Overloading anche le funzioni membro possono essere sovraccaricate, ma soltanto nella loro propria classe, con le stesse regole utilizzate per sovraccaricare funzioni ordinarie due funzioni membro sovraccaricate non possono avere lo stesso numero e tipo di parametri l'overloading permette di utilizzare uno stesso nome per più metodi che si distingueranno solo per i parametri passati all'atto della chiamata class Prodotto { public: int prodotto (int m, int n); // metodo 1 int prodotto (int m, int p, int q); // metodo 2 int prodotto (float m, float n); // metodo 3 int prodotto (float m, float n, float p); // metodo 4 Tipi di ereditarietà • in una classe, gli elementi pubblici sono accessibili a tutte le funzioni, quelli privati sono accessibili soltanto ai membri della stessa classe e quelli protetti possono essere acceduti anche da classi derivate (proprietà dell'ereditarietà) • vi sono tre tipi di ereditarietà: pubblica, privata e protetta, la più utilizzata delle quali è la prima • una classe derivata non può accedere a variabili e funzioni private della sua classe base • per occultare dettagli una classe base utilizza normalmente elementi protetti invece che elementi privati • supponendo ereditarietà pubblica, gli elementi protetti sono accessibili alle funzioni membro di tutte le classi derivate • per default, l’ereditarietà è privata; se accidentalmente si dimentica la parola riservata public, gli elementi della classe base saranno inaccesibili • Esempio class Base{ public: int i1; protected: int i2; private: int i3; }; class D1: private Base { void f(); }; … void D1::f() { i1=0; // corretto i2=0 // corretto i3=0 // ERRATO }; class D2: protected Base { void g(); }; class D3: public Base { Void h(); }; Le tre classi accedono ai membri i1 e i2 i3 è inaccessibile a tutte E dall’esterno? int main() { Base b; b.i1=0; // ok b.i2=0; // ERRORE b.i3=0; // ERRORE D1 d1; d1.i1=0; // ERRORE d1.i2=0; // ERRORE d1.i3=0; // ERRORE D2 d2; d2.i1=0; // ERRORE d2.i2=0; // ERRORE d2.i3=0; // ERRORE D3 d3; d3.i1=0; // ok d3.i2=0; // ERRORE d3.i3=0; // ERRORE } • Costruttore di una classe derivata la sintassi di un costruttore di una classe derivata è: ClasseDer::ClasseDer(paramD):ClasseBase(paramB), Inizial { // corpo del costruttore della classe derivata}; Inizial è l’inizializzazione di membri dato della classe class Data { public: Data(int, int, int); private: int giorno, mese, anno; }; class Impiegato : public Persona { public: Impiegato(string, string, string, int, int, int, int, int, int); private: string matricola; const Data data_assunzione; }; class Persona { public: Persona(string, string, int g, int m, int a); private: string nome; string cognome; Data data_nascita; }; // costruttore per la classe Impiegato Impiegato::Impiegato(string n, string c, string mat, int gg, int mm, int aa, int giornoa, int mesea, int annoa):Persona(n,c,gg,mm,aa), data_assunzione(giornoa, mesea, annoa) Ereditarietà multipla • la sintassi è: class Derivata : [virtual][tipo_accesso] Base1, [virtual][tipo_accesso] Base2, [virtual][tipo_accesso] Basen { public: // sezione pubblica private: // sezione privata ... }; • derivata: nome della classe derivata • tipo_accesso: public, private o protected • Base1, Base2,...: classi base con nomi differenti • virtual..: è opzionale e specifica una classe base compatibile. • Funzioni o dati membro che abbiano lo stesso nome in Base1, Base2, Basen, • costituiranno motivo di ambiguità Esempio class Studente { private: long matricola; … public: long getMatricola() const; … }; class Lavoratore { private: long stipendio; public: long getStipendio() const; … }; class studente_lavoratore: public studente, public lavoratore Esercizi • Ereditarietà: Creazione di una classe Studente derivata da Persona • Arricchimento della classe Studente con nuove funzioni per la gestione degli esami • Creare una classe libro con titolo, editore, prezzo e derivare la classe rivista aggiungendo l’attributo sulla periodicità • Creare la classe veicolo e derivare la classe automobile e autobus: aggiungere gli attributi opportuni e il metodo che consente di visualizzare i valori degli attributi • Derivare dalla classe conto (già creata in precedenza) una nuova classe conto corrente: aggiungendo i metodi Preleva, che decrementa il saldo della cifra fornita come parametro, Versa, che incrementa il saldo e Mostra, che visualizza il saldo Esercizi • Costruire una classe base anagrafica con codice, cognome, nome, registrato (è un bool). I suoi metodi sono registra (bool diventa true) e mostra solo se è stato registrato. Prevedere anche il costruttore. Derivare da essa la classe Dipendente, aggiungendo gli attributi per la mansione e lo stipendio e modificando il metodo di registrazione della classe base con l’assegnazione della mansione che svolge in azienda • Derivare dalla classe anagrafica, la classe cliente aggiungendo gli attributi per il telefono, partita IVA e modificando il metodo di registrazione della classe base con l’assegnazione della partita IVA • Costruire la classe Dipendente e derivare le classi Operaio, Impiegato e Dirigente. Nella classe base l’attributo stipendio viene dichiarato protetto in modo che possa essere modificato anche con i metodi delle classi derivate • Una classe solido consente di rappresentare una figura solida e di calcolarne il volume; derivare da essa la classe Bilancia che consente di modificare il metodo per il calcolo, in modo da ottenere anche il peso del solido conoscendone il peso specifico (peso= volume*peso specifico) Array di oggetti • Docente array.cpp • Creare una classe che permette l’inserimento di descrizione, prezzo, numero di reparto per 4 articoli di magazzino Funzioni virtuali * Virtuall.cpp * Es pag 181 n. 24
Docsity logo


Copyright © 2024 Ladybird Srl - Via Leonardo da Vinci 16, 10126, Torino, Italy - VAT 10816460017 - All rights reserved