Docente: Giuseppe Scollo
Università di Catania, sede di Comiso (RG)
Facoltà di Scienze Matematiche, Fisiche e Naturali
Corso di Studi in Informatica applicata, AA 2007-8
la programmazione orientata agli oggetti estende la programmazione procedurale con i concetti di
nasce nell'ambito dei linguaggi di simulazione: Simula 67
ben si presta alla rappresentazione della concorrenza
si sviluppa negli anni '80 come paradigma di progettazione del software
linguaggi più diffusi: Smalltalk, C++, Eiffel, Java
anni '90: diventa il paradigma dominante nella produzione industriale di software
standardizzazione:
il concetto di tipo di dato astratto (ingl. abstract data type : ADT) nasce negli anni '70, come costrutto per la definizione, da parte del programmatore, di costruttori di tipi di dati
ADT nei linguaggi OO:
visibilità dei membri (variabili e operazioni) di una classe: public, protected, private
in C++: si conviene che l'interfaccia di una classe consista dei profili delle sue operazioni pubbliche
riformuliamo nella sintassi delle classi la definizione del tipo di dato dei punti nello spazio bidimensionale, con una funzione per la distanza da un punto dato (v. lezione 7)
Punto2D.h: interfaccia + struttura dati
class Punto2D { public: Punto2D(); // costruttore float distanza2D(Punto2D) const; // operazione "query" private: float x, y; }
implementazione Punto2D.c++
(con specifica di ambito mediante "::
") :
#include <cstdlib> #include <cmath> #include "Punto2D.h" Punto2D::Punto2D() { x = 1.0*rand()/RAND_MAX; y = 1.0*rand()/RAND_MAX; } float Punto2D::distanza2D(Punto2D a) const { float dx = x-a.x, dy = y-a.y; return sqrt(dx*dx + dy*dy); }
l'esempio precedente mostra una soluzione di compromesso fra
un altro compromesso, stavolta rispetto al principio di incapsulamento, è fornito dalla possibilità di dichiarare come friend, in un classe, funzioni e classi che non ne sono membri
ad esempio, la funzione float distanza2D(Punto2D a, Punto2D b)
potrebbe venir definita
al di fuori della classe Punto2D
,
con il codice visto nella lezione 7,
pur di includere nella definizione di questa classe la dichiarazione
friend float distanza2D(Punto2D, Punto2D);
con le classi si possono definire nuovi tipi di dati: per poterli usare in modo simile ai tipi di dati predefiniti sono necessari alcuni accorgimenti, fra i quali l'overloading di operatori di uso comune
eccone due esempi, per il tipo di dato Punto2d
visto sopra
ridefiniamo l'eguaglianza di due punti, per farla valere se la loro distanza è inferiore a una data soglia:
friend int operator==(Punto2D a, Punto2D b) { return(distanza2D(a, b) < .001; }
supponiamo ora che il suddetto tipo di dato sia dotato di due funzioni membro pubbliche per leggerne le coordinate:
float X() const { return x; } float Y() const { return y; }
in tal caso possiamo ridefinire l'operatore <<
della classe standard ostream
,
per specificare l'output di dati di tipo Punto2d
in un formato
conveniente:
ostream& operator<<(ostream& t, Punto2d p) { t << "(" << p.X() << "," << p.Y() << ")"; return t; }
Punto2D
in modo da rappresentare punti in coordinate polari