Sei sulla pagina 1di 5

Overloading: significa che possiamo dare lo stesso nome a pi di una funzione purch esse abbiano un

diverso numero di parametri o almeno un parametro di tipo diverso.

Identit: Ogni oggetto ha la sua identit anche se i loro attributi sono identici.

Polimorfismo: La stessa operazione si comporta diversamente in diverse classi (es. operazione Muovi
nella classe PezzoScacchi e Bicicletta). Polimorfismo= diversi metodi per operatore. La possibilit che le
classi derivate implementino in modo differente i metodi e le propriet dei propri antenati rende
possibile che gli oggetti appartenenti a delle sottoclassi di una stessa classe rispondano diversamente
alle stesse istruzioni. Tale eventualit viene detta polimorfismo. Ad esempio in una gerarchia in cui le
classi Cane e Gatto discendono dalla SuperClasse Animale potremmo avere il metodo mangia() che
restituisce la stringa "osso" se eseguito sulla classe Cane e "pesce" se eseguito sulla classe Gatto. I
metodi che vengono ridefiniti in una sottoclasse sono detti polimorfi, in quanto lo stesso metodo si
comporta diversamente a seconda del tipo di oggetto su cui invocato. In linguaggi in cui le variabili
non hanno tipo come Smalltalk e Python possibile richiamare un qualsiasi metodo su di un qualsiasi
oggetto, quindi il polimorfismo molto pi esteso, sebbene ci comporti la possibilit di errori a
runtime. Tali errori sono eliminabili da linguaggi con tipi, ma ci possibile solamente riducendone
l'espressivit oppure accettando dei buchi nel type system (e.g. i NullPointerException di Java). Il
polimorfismo particolarmente utile quando la versione del metodo da eseguire viene scelta sulla base
del tipo di oggetto effettivamente contenuto in una variabile a runtime, invece che al momento della
compilazione. Tale funzionalit detta binding dinamico ( o late-binding). Se ho una variabile di tipo A,
e il tipo A ha due sottoclassi B e C, che ridefiniscono entrambe il metodo m(), l'oggetto contenuto nella
variabile potr essere di tipo A, B o C, e quando sulla variabile viene invocato il metodo m() viene
eseguita la versione appropriata per il tipo di oggetto contenuto nella variabile in quel momento. Il C++
per default non usa il binding dinamico.
Il polimorfismo e il binding dinamico in C++ si ottengono solo:
dichiarando virtual i metodi polimorfi
operando tramite puntatori e riferimenti
Classi base astratte: Le classi che hanno qualche funzione membro virtuale pura sono dette classi
astratte. Le classi astratte non sono istanziabili ed esistono solo come classi base da cui derivare altre
classi. Le classi astratte sono la maniera migliore di rappresentare le principali interfacce di un sistema
software: rendono possibile luso simultaneo di molte implementazioni differenti del concetto
rappresentato dallinterfaccia; isolano completamente gli utenti dalle modifiche nelle implementazioni.

Classe string: Le stringhe in C++ come in C sono array di caratteri (tipo char) terminati dal carattere
speciale /0. La classe string usata in C++ per nascondere allutente le manipolazioni a basso livello.
Per l utilizzo della classe string necessario includere l header string. La classe string ha una serie di
metodi per la manipolazione delle stringhe di caratteri alcune delle quali accessibili attraverso operatori
comuni come +,=,==,

Classe Fstram: Dobbiamo includere la libreria <fstream> per qualsiasi operazione di I/O su file. La
libreria <fstream> fornisce al programmatore un modo semplice per lavorare con i file. In alcune
implementazioni <fstream> include <iostream> (per sicurezza provare con il vostro compilatore). L
istruzione ofstream sta per output file stream e crea un riferimento ad un file su cui scrivere. Il nome
del file su cui scrivere viene specificato come argomento; nel nostro caso file1.txt. Ofstream una
classe quindi con la sintassi filewrite(file1.txt) dichiariamo un oggetto della classe ofstream. Il
parametro tra parentesi (e.g. file1.txt) viene passato al costruttore.
Ereditariet: Creazione di una gerarchia tra le classi. Metodo di progetto top-down: una superclasse
viene definita in modo generico e poi viene perfezionata via-via in sottoclasse. La superclasse fattorizza
le propriet comuni di diverse classi. Una sottoclasse eredita tutte le propriet della sua superclasse e
aggiunge altre propriet. Normalmente le propriet della superclasse non sono ripetute in ogni
sottoclasse.

Scope: Per definire una funzione gi dichiarata all interno di una classe, dobbiamo utilizzare il nuovo
operatore chiamato risolutore di visibilit (o scope) indicato con ::. Il risolutore di visibilit accetta
come operando sinistro il nome della classe che contiene la dichiarazione di funzione (e.g. Rettangolo),
e come operando destro il nome che la funzione stessa ha all interno della classe (e.g. modifica). Il
risolutore di visibilit necessario in quanto altre classi potrebbero definire un metodo con lo stesso
nome.Pertanto la sintassi : <nome_classe>::<nome_metodo>

Costruttore: Esiste uno speciale tipo di metodo, chiamata costruttore, specificatamente progettato per
inizializzare gli oggetti. OSSIA UTILIZZARE UN ALTRO METODO PER INIZIALIZZARE GLI ATTRIBUTI E
SCORRETTO. I costruttori sono metodi invocati ogni volta che un oggetto viene dichiarato ed hanno lo
scopo di inizializzare l oggetto. I costruttori si distinguono dagli altri metodi perch hanno lo stesso
nome della classe e non restituiscono alcun valore. Definire un costruttore che restituisce un valore
errore. E buona prassi definire un costruttore per ogni classe definita.

Costruttore copia: possibile definire un particolare costruttore detto costruttore copia che viene
invocato quando si crea un oggetto e lo si vuole inizializzare mediante un oggetto preesistente della
stessa classe. Il costruttore copia si distingue dagli altri in quanto accetta come input un riferimento ad
oggetti della propria classe. Il Costruttore di Copia utile quando si passa o si ritorna un oggetto ad una
funzione. In generale il Costruttore di Copia utile quando si copia un oggetto.

Esempio:

class Rettangolo{
private:
double altezza;
double larghezza;
public:
Rettangolo() { larghezza= altezza= 0; } // costruttore di default
Rettangolo(double W,double H){ larghezza=W;
Altezza=H;} //costruttore con argomenti
Rettangolo(const Rettangolo &orig{
larghezza= orig.larghezza; altezza=orig.altezza; })
double area() { return (larghezza * altezza)}
void modifica(double, double)
};
Distruttore: L operatore complementare del costruttore il distruttore che viene richiamato all uscita
del blocco in cui stato dichiarato loggetto, per liberare l area di memoria occupata dallo stesso.
buona norma utilizzarlo sempre in modo tale che il programma non continui ad allocare spazi
inutilizzati (analogamente alla free). Il distruttore si distingue dagli altri metodi perch ha il nome della
classe preceduto dal simbolo (tilde) ~ . Un distruttore non accetta parametri di input e non restituisce
valori in uscita. buona prassi fornire un distruttore per ogni classe definita. Di conseguenza non
potendo fare overloading, in una classe vi pu essere un solo distruttore.
Ereditariet: L ereditariet il meccanismo che consente ad una classe di avere accesso ai dati
membro di un altra classe senza doverli ridefinire.La classe originaria si dice classe base. Le classi che
ereditano si dicono classi derivate. La sintassi per la dichiarazione :
class <nome_clderiv>: <tipoereditarieta> <nome_clbase>
{
.
};
Esistono tre tipi di ereditariet ( o accesso):
private
public
protected
Il valore di default private. Vediamo le tre forme di ereditariet:
Accesso public, i membri ereditati hanno la stessa protezione che avevano nella classe base: gli
utenti della classe derivata possono usare i membri pubblici ereditati
Accesso private, i membri ereditati divengono membri privati della classe ereditata: gli utenti della
classe derivata non possono usare i membri ereditati
Accesso protected, i membri pubblici e protetti ereditati divengono membri protetti della classe
derivata.

Costruttori e distruttori classe derivate: Quando viene definito un oggetto di una classe derivata, viene
sempre invocato il costruttore della classe base. Linvocazione del distruttore di una classe derivata
produce automaticamente la chiamata di tutti i distruttori delle sue superclassi.
I distruttori sono chiamati secondo lordine che si ottiene risalendo via via la gerarchia delle classi.
Il distruttore di una classe derivata non deve invocare esplicitamente il distruttore della classe base.
Il distruttore deve solo preoccuparsi delle azioni di pulizia relative ai nuovi dati membro introdotti nella
classe derivata e ai file aperti dalle nuove funzioni membro della classe derivata

Ovverriding dei metodi: Una classe derivata pu ridefinire funzioni membro gi disponibili a livello
della classe base. In questo caso, se utile, la funzione originale utilizzabile nella ridefinizione, grazie
allimpiego delloperatore di risoluzione dello scope.

Upcasting e Object slicing: Un oggetto di una classe derivata pu essere implicitamente convertito in
un oggetto della classe base. Questa operazione di chiama upcasting, perch ci si muove verso lalto
nella gerarchia delle classi. Upcasting produce per lobject slicing, con perdita dei dati membro definiti
a livello della classe derivata. Esempio un oggetto della classe point3D pu essere convertito in un
oggetto della classe point. Ma questo comporta la perdita dell attributo z.
STL: standard template library:

Iteratori: Gli iteratori sono dei puntatori


agli elementi di un contenitore e ci
permettono di muoverci allinterno di esso.
Iteratori monodirezionali: Permettono di
accedere allelemento successivo o al
precedente.
Iteratori bidirezionali: Permettono di
accedere sia allelemento successivo che al
precedente.
Iteratori ad accesso casuale: Permettono
di accedere ad un qualunque elemento del
contenitore.

Contenitori: Un contenitore un oggetto capace di immagazzinare altri oggetti e che possiede metodi
per accedere ai suoi elementi.Ogni contenitore ha un iteratore associato che permette di muoversi tra
gli elementi contenuti. Una sequenza un contenitore di lunghezza variabile i cui elementi sono
organizzati linearmente. E possibile aggiungere e rimuovere elementi. Un contenitore associativo una
sequenza che permette un efficiente accesso ai suoi elementi basato su una chiave.

Sequenze: vector e list.


Vector: Tempo costante di inserimento e cancellazione di elementi allinizio e alla fine del vettore.
Tempo lineare con il numero di elementi per inserimento e cancellazione di elementi allinterno del
vettore. Iteratore ad accesso casuale. Le locazioni di memoria sono contigue. Accesso casuale, veloce
laccesso agli elementi, lenti inserimento ed estrazione.
La classe vector A differenza di un array, non necessario predeterminarne la dimensione
E un template -- classe parametrica, si tratta di una classe che pu essere utilizzata con pi tipi di dato.
Uso del template <vector>:
vector<tipo> v // per la dichiarazione
v.push_back(arg) // metodo per inserire elementi
v[12] // metodo per estrarre elementi
List: Tempo costante di inserimento e cancellazione di elementi in ogni punto della lista. Iteratore
bidirezionale. Simile allo stack, ma consente di muoversi in due direzioni. Le locazioni di memoria non
sono contigue. Lenta la ricerca, veloci inserimento ed estrazione.
(Map) Contenitori associativi: Sono contenitore di coppie ( key, value ) e possiedono un iteratore
bidirezionale. Un esempio di contenitore associativo map . In map viene richiesto loperatore < per la
chiave; Gli elementi sono ordinati secondo la chiave.
Algoritmo STL: Gli algoritmi (in STL) sono delle funzioni globali capaci di agire su contenitori differenti
Sono incluse operazioni di ordinamento (sort, merge, min, max...), di ricerca (find, count, equal...), di
trasformazione (transform, replace, fill, rotate, shuffle...), e generiche operazioni numeriche
(accumulate, adjacent difference...).

Selettore: metodo che non modifica gli attributi di una classe. dichiarato const
Modificatore: metodo che pu modificare gli attributi di una classe
Friend: La keyword friend puo` essere usata perche` una funzione (o una classe) abbia libero accesso ai
dati privati di unaltra classe. friend (nonostante il nome) e` nemico dellincapsulamento e quindi
dellObject Orientation. Un uso eccessivo di friend quasi sempre sintomo di un cattiva progettazione
Esistono anche situazioni in cui un friend pu essere accettabile: Overloading di operatori binari,
Considerazioni di efficienza, Relazione speciale fra due classi.

Static: Attributi dichiarati static in una classe sono condivisi da tutti gli oggetti di quella classe. Metodi
dichiarati static non possono accedere ad attributi non statici della classe. Attributi statici possono
essere usati e modificati soltanto da metodi statici. Nonostante lutilizzo di static sembri imporre
condizioni troppo restrittive, esso risulta utile nellimplementazione di: contatori e singleton. Un
singleton una classe di cui, ad ogni momento nel corso del programma, non pu esistere pi di una
istanza. utile per limplementazione di classi manager di cui deve esistere una sola istanza

Template: In C++ possibile definire classi o funzioni generiche.


Una funzione o una classe generica definisce una serie di operazioni applicabili ad un qualsiasi tipo di
dato. Questo tipo di funzioni e classi prendono il nome di template

Potrebbero piacerti anche