Modifiche recenti - Cerca:

Categorie

Pagine utente

Winzipedia

Uso dell'wiki

modifica il menu

ObjectOrientedCpp

Informatica3.ObjectOrientedCpp Versioni

Nascondi le modifiche minori - Mostra le modifiche

Modificate le linee 2-4: da:
'''Autore:''' [[Profiles.Estefan|Estefan Civera]]\\
'''Hanno contribuito:'''
a:
'''Autore:''' [[Profiles.Estefan|Estefan Civera]]
Modificata la linea 228: da:
int Car::fun_weight(double new_weight) const
a:
int Car::fun_weight(const double weight)
Modificata la linea 159: da:
Il quarto caso l'evoluzione del terzo. Viene fatto un cast nel caso il tipo passato fosse diverso dal tipo di dato aspettato dal parametro del costruttore, (in questo caso il cast sarebbe omissibile).
a:
Il quarto caso l'evoluzione del terzo. Viene fatto un cast nel caso il tipo passato fosse diverso dal tipo di dato aspettato dal parametro del costruttore (in questo caso il cast sarebbe omissibile).
Modificata la linea 159: da:
Il quarto caso l'evoluzione del terzo. Viene fatto un cast nel caso il tipo passato fosse diverso dal tipo di dato aspettato dal parametro del costruttore. (in questo caso il cast sarebbe omissibile.
a:
Il quarto caso l'evoluzione del terzo. Viene fatto un cast nel caso il tipo passato fosse diverso dal tipo di dato aspettato dal parametro del costruttore, (in questo caso il cast sarebbe omissibile).
16/06/2006 ore 16:33 CEST di Vincenzo - Risorse utili
Modificate le linee 297-300: da:
[[Attach:Template-STL.pdf | Template e STL]]
a:
[[Attach:Template-STL.pdf | Template e STL]]

!! Altre risorse utili
[[http://www.mindviewinc.com/downloads/TICPP-2nd-ed-Vol-one.zip | Thinking in C++]], di Bruce Eckel
15/06/2006 ore 18:32 CEST di Vincenzo - Correzioni ortografiche
Modificate le linee 288-289: da:
#Mach con promozione: si utilizza (se esiste) una versione della funzione che richieda al promozioni di tipo (ad esempio da int a long int, oppure da float a double);
#Mach con conversioni standard: si utilizza (se esiste) una versione della funzione che richieda al conversioni di tipo standard (ad esempio da int a unsigned int);
a:
#Match con promozione: si utilizza (se esiste) una versione della funzione che richieda al promozioni di tipo (ad esempio da int a long int, oppure da float a double);
#Match con conversioni standard: si utilizza (se esiste) una versione della funzione che richieda al conversioni di tipo standard (ad esempio da int a unsigned int);
15/06/2006 ore 11:22 CEST di Vincenzo - Template e STL
Modificate le linee 295-299: da:
[[Attach:C++SecondaParte.pdf | Seconda parte]]

!! Commenti
Nell'ottimo riassunto di Estefan manca la parte sull'
STL: c' qualcuno che ha voglia di occuparsente?
->Vincenzo
a:
[[Attach:C++SecondaParte.pdf | Seconda parte, esclusi Template e STL]]

[[Attach:Template-STL.pdf | Template e STL]]
15/06/2006 ore 10:19 CEST di Vincenzo - Annuncio STL
Aggiunte le linee 296-299:

!! Commenti
Nell'ottimo riassunto di Estefan manca la parte sull'STL: c' qualcuno che ha voglia di occuparsente?
->Vincenzo
15/06/2006 ore 10:12 CEST di Vincenzo - Aggiunta del pdf della seconda parte
Aggiunte le linee 294-295:

[[Attach:C++SecondaParte.pdf | Seconda parte]]
14/06/2006 ore 14:40 CEST di Andrea - Corretto esempio parametri di default
Modificate le linee 271-272: da:
@@inline int sum(int a, int b){return a+b;}@@
a:
@@inline int sum(int a=0, int b=0){return a+b;}@@
14/06/2006 ore 12:10 CEST di Giorgio - Correzzione sintattica
Modificate le linee 29-30: da:
Il miglioramento significativo del linguaggio C++ il supporto della programmazione orientata agli oggetti (Object Oriented Programming: OOP), Per sfruttare tutti i benefici introdotti dal C++ occorre cambiare approccio nella soluzione dei problemi. Ad esempio, occorre identificare gli oggetti e le operazioni ad essi associate e costruire tutte le classi e le sottoclassi necessarie.
a:
Il miglioramento significativo del linguaggio C++ il supporto della programmazione orientata agli oggetti (''Object Oriented Programming: OOP''), Per sfruttare tutti i benefici introdotti dal C++ occorre cambiare approccio nella soluzione dei problemi. Ad esempio, occorre identificare gli oggetti e le operazioni ad essi associate e costruire tutte le classi e le sottoclassi necessarie.
Modificata la linea 51: da:
*Estende le caratteristiche del C, rimediando almeno in parte alle carenze del suo predecessore (che manca soprattutto di un buon sistema dei tipi) ad esempio con l'aggiunta dei tipi @bool@. In particolare l'introduzione di costrutti quali i Template e le Classi rende il C++ un linguaggio multiparadigma (con particolare predilezione per il paradigma ad oggetti e la programmazione generica).
a:
*Estende le caratteristiche del C, rimediando almeno in parte alle carenze del suo predecessore (che manca soprattutto di un buon sistema dei tipi) ad esempio con l'aggiunta dei tipi @@bool@@. In particolare l'introduzione di costrutti quali i Template e le Classi rende il C++ un linguaggio multiparadigma (con particolare predilezione per il paradigma ad oggetti e la programmazione generica).
08/06/2006 ore 16:34 CEST di Estefan Civera -
Modificate le linee 262-263: da:
@@inline int sum(int a, int b){return a+b;}@@\\
a:
@@inline int sum(int a, int b){return a+b;}@@
Modificate le linee 271-272: da:
@@inline int sum(int a, int b){return a+b;}@@\\ @@sum@@
a:
@@inline int sum(int a, int b){return a+b;}@@
Modificata la linea 287: da:
#Match esatto: se esiste una versione della funzione che richiede esattamente quel tipo di parametri (i parametri vengono considerati a uno a uno secondo l'ordine in cui compaiono)
a:
#Match esatto: se esiste una versione della funzione che richiede esattamente quel tipo di parametri (i parametri vengono considerati a uno a uno secondo l'ordine in cui compaiono)
08/06/2006 ore 16:29 CEST di 193.204.249.156 -
Modificate le linee 63-64: da:
Il concetto di ''abstraction'' sta ad indicare che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni.#
a:
Il concetto di ''abstraction'' sta ad indicare che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni.
Modificata la linea 96: da:
L'esempio qui descritto mostra come l'istruzione @Time dinnerTime;@ non porti a nessuna inizializzazione degli attributi interni. cause problemi (ad esempio durante un calcolo matematico, o se un puntatore punta ad un area non valida).
a:
L'esempio qui descritto mostra come l'istruzione @@Time dinnerTime;@@ non porti a nessuna inizializzazione degli attributi interni. cause problemi (ad esempio durante un calcolo matematico, o se un puntatore punta ad un area non valida).
Modificata la linea 100: da:
Ecco la stessa soluzione ottenuta tramite l'implementazione della classe Time
a:
Ecco la stessa soluzione ottenuta tramite l'implementazione della classe Time\\
Modificate le linee 163-164: da:
Per quanto riguarda l'allocazione dinamica...
a:
Per quanto riguarda l'allocazione dinamica...\\
Modificate le linee 179-182: da:

a:
Per richiamare il costruttore padre si usa l'operatore ":".

class Base;
class Derived public Base {
public:
Derived(int x, y)
:
Base(x){
y = 0;
}
}
08/06/2006 ore 15:33 CEST di Estefan Civera -
Modificate le linee 7-8: da:
a:
->[-Storia-]
->[-Abstract data type-]
->[-Diffusione del linguaggio-]
->[-Abstraction-]
->[-Using constructor-]
->[-Inizializzazione del costruttore-]
->[-Distruttore-]
->[-Operatori new e delete-]
->[-Function declaration-]
->[-Passaggio di parametri-]
->[-Metodi e attributi statici-]
->[-Funzioni inline-]
->[-Argomenti di default-]
->[-Overloading delle funzioni-]
Modificata la linea 31: da:
!!!Abstract data type
a:
!!Abstract data type
Modificate le linee 46-47: da:
!!!Diffusione
a:
!!Diffusione del linguaggio
Cancellate le linee 61-62:
!Classes and Data Abstraction
Modificate le linee 177-181: da:
!!!Inizializzazione del costruttore
a:
!!Inizializzazione del costruttore
08/06/2006 ore 15:23 CEST di Estefan Civera -
Modificate le linee 38-39: da:
Altre caratteristiche fondamentali che sono state inserite in C++ sono la gestione delle eccezioni, l'utilizzo del costruttore di copia, il passaggio per riferimento, e la gestione dell'ovrloading/overriding.
a:
Altre caratteristiche fondamentali che sono state inserite in C++ sono la gestione delle eccezioni, l'utilizzo del costruttore di copia, il passaggio per riferimento, e la gestione dell'overloading/overriding.
Modificate le linee 42-44: da:
* La potenza e la tipiche del C e del C++ non sono gratuite. Se da una parte e` vero che e` possibile ottenere applicazioni in generale piu` efficienti (rispetto ad agli altri linguaggi), e anche vero che tutto questo e` ottenuto lasciando in mano al programmatore molti dettagli e compiti che negli altri linguaggi sono svolti dal compilatore; e` quindi necessario un maggiore lavoro in fase di progettazione e una maggiore attenzione ai particolari in fase di realizzazione, pena una valanga di errori spesso subdoli e difficili da individuare che possono far levitare drasticamente i costi di produzione;
* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
*Dipendenza del codice prodotto con l'architettura harware sottostante.
a:
* La potenza e la tipiche del C e del C++ non sono gratuite. Se da una parte vero che possibile ottenere applicazioni in generale efficienti (rispetto ad agli altri linguaggi), e anche vero che tutto questo ottenuto lasciando in mano al programmatore molti dettagli e compiti che negli altri linguaggi sono svolti dal compilatore; quindi necessario un maggiore lavoro in fase di progettazione e una maggiore attenzione ai particolari in fase di realizzazione, pena una valanga di errori spesso subdoli e difficili da individuare che possono far levitare drasticamente i costi di produzione;
* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a runtime: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
*Dipendenza del codice prodotto con l'architettura hardware sottostante.
Modificate le linee 51-52: da:
Il concetto di ''abstraction'' sta ad indicare che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni.
a:
Il concetto di ''abstraction'' sta ad indicare che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni.#
Modificata la linea 88: da:
Ecco la stessa soluzione ottunuta tramite l'implentazione della classe Time
a:
Ecco la stessa soluzione ottenuta tramite l'implementazione della classe Time
Modificata la linea 119: da:
# L'utilizzo del construtture permette di inizializzare i data members. permette di poter dire che l'oggetto si sempre in uno stato consistente.
a:
# L'utilizzo del costruttore permette di inizializzare i data members. permette di poter dire che l'oggetto si sempre in uno stato consistente.
Modificata la linea 122: da:
!! Using construtctor
a:
!! Using constructor
Modificate le linee 125-126: da:
Facendo sempre riferimento all'esempio precedente ecco come possibile fare l'overloading del costruttore e come ogni volta cambia la sua inplementazione
a:
Facendo sempre riferimento all'esempio precedente ecco come possibile fare l'overloading del costruttore e come ogni volta cambia la sua implementazione
Modificata la linea 146: da:
Il terzo caso un po' particolare, infatti se un costrutture riceve un solo parametro in ingresso possbile gestirlo (creazione e inizializzazione) come se fosse una comune variabile (in questo caso un intero).
a:
Il terzo caso un po' particolare, infatti se un costruttore riceve un solo parametro in ingresso possibile gestirlo (creazione e inizializzazione) come se fosse una comune variabile (in questo caso un intero).
Modificata la linea 151: da:
Per quanto rigurada l'allocazione dinamica...
a:
Per quanto riguarda l'allocazione dinamica...
Aggiunta la linea 169:
Modificata la linea 172: da:
Il distruttore viene richiamato automaticamente quando si applica l'operatore delete ad un puntatore alla classe oppure quando un programma esce dal campo di di un oggetto della classe. A differenza dei costruttori, i distruttori non possono accettare argomenti e non possono essere modificati tramite overloading.
a:
Il distruttore viene richiamato automaticamente quando si applica l'operatore @@delete@@ ad un puntatore alla classe oppure quando un programma esce dal campo di di un oggetto della classe. A differenza dei costruttori, i distruttori non possono accettare argomenti e non possono essere modificati tramite overloading.
Modificata la linea 178: da:
Per deallocare la memoria dell'area heap in C++ mette a disposizione l'operatore delete. Questo operatore non restituisce alcun valore e quindi deve essere usato da solo in un'istruzione.
a:
Per deallocare la memoria dell'area heap in C++ mette a disposizione l'operatore @@delete@@. Questo operatore non restituisce alcun valore e quindi deve essere usato da solo in un'istruzione.
Modificate le linee 182-185: da:
Contrariamente a quanto sembra l'operatore delete non cancella la variabile @@nome_puntatore@@, altera il suo contenuto: l'unico effetto di liberare la memoria puntata rendendola disponibile per ulteriori allocazioni.

Se l'operando punta a un'area in cui sono stati allocati oggetti (array), delete va specificato con una coppia di parentesi quadre (senza la dimensione, che il C++ in grado di riconoscere automaticamente). Ad esempio:
a:
Contrariamente a quanto sembra l'operatore @@delete@@ non cancella la variabile @@nome_puntatore@@, altera il suo contenuto: l'unico effetto di liberare la memoria puntata rendendola disponibile per ulteriori allocazioni.

Se l'operando punta a un'area in cui sono stati allocati oggetti (array), @@delete@@ va specificato con una coppia di parentesi quadre (senza la dimensione, che il C++ in grado di riconoscere automaticamente). Ad esempio:
Modificate le linee 194-196: da:


Per evitare problemi con l'operatore @@delete@@ ogni qualvolta che si dichiara un pointer lo si pone a NULL. (La cancellazione di un pointer nulla non da alcun problema). Inoltre se il puntatore
a:


Per evitare problemi con l'operatore @@delete@@ ogni qualvolta che si dichiara un pointer lo si pone a NULL. (La cancellazione di un pointer nulla non da alcun problema).


!!Function declaration

@@return_type method_name(param,...)@@.



Eccone un esempio...\\

int Car::fun_weight(double new_weight) const
{

new_weigth += weight;
return (int) new_weight;
}


!!Passaggio di parametri
Il passaggio di parametri in C/C++ avviene per valore e per riferimento.

Il passaggio per valore comporta la copia sullo stack dell'intero oggetto (molto inefficienti per oggetti di notevole dimensione). Inoltre ogni modifica apportata non impatta sull'oggetto ma solo sulla copia.




C++ permette di realizzare il passaggio per riferimento in due modi.\\

# void foo(Type* t); // Basato sull'utilizzo dei puntatori, vantaggi e svantaggi //dell'utilizzo dei puntatori
# void foo(Type& t); // Non necessita del not null checking.

!!Metodi e attributi statici

#non possono accedere campi e metodi non statici
#non possono invocare metodi non statici
#non possono usare il pointer this
#non possono essere dichiarati virtuali

!!Funzioni inline

Per non rinunciare ai vantaggi forniti dalle (piccole) funzioni e a quelli forniti da un controllo statico dei tipi, sono state introdotte nel C++ le funzioni @@inline@@.

Se si desidera che una funzione sia espansa @@inline@@ dal compilatore, occorre definirla esplicitamente @@inline@@:

@@inline int sum(int a, int b){return a+b;}@@\\




!!Argomenti di default


@@inline int sum(int a, int b){return a+b;}@@\\ @@sum@@



!!Overloading delle funzioni
L'overloading consiste nel sovraccaricare un operatore o una funzione per far si che essa funzioni con variabili aventi tipi diversi.

void Foo(int a, float f);
int Foo(int a, float f); // Errore!
int Foo(float f, int a); // Ok!
char Foo(); // Ok!
char Foo(...); // OK



#Match esatto: se esiste una versione della funzione che richiede esattamente quel tipo di parametri (i parametri vengono considerati a uno a uno secondo l'ordine in cui compaiono)


#Match con conversioni definite dall'utente: si tenta un matching con una definizione (se esiste), cercando di utilizzare conversioni di tipo definite dal programmatore;


08/06/2006 ore 11:00 CEST di 193.204.249.156 -
08/06/2006 ore 10:33 CEST di 193.204.249.156 -
Modificate le linee 184-191: da:
float* punt = new float [100] ; // alloca 100 oggetti float
delete [] punt; // libera tutta la memoria allocata

L'operatore delete costituisce l'unico mezzo per deallocare memoria heap, che, altrimenti, sopravvive fino alla fine del programma, anche quando non raggiungibile. Ad esempio:

int* punt = new int; // alloca un int nell'area heap
int a;
punt = &a; /*assegna a punt un indirizzo dell'area stack, per cui
l'oggetto int dell'area heap non raggiungibile e deallocabile*/
a:

int i =
new int;
delete i
;

float* punt = new
float [100] ; // alloca 100 oggetti float
delete [] punt; // libera tutta la memoria allocata

L'operatore delete costituisce l'unico mezzo per deallocare memoria heap, che, altrimenti, sopravvive fino alla fine del programma, anche quando non raggiungibile.

Ad ongi operazione di allocazione di memoria (new) deve corrispondere una e una sola operazione di rimozione (delete). In caso contrario si possono verificare resource leak con conseguente del processo.

Per evitare problemi con
l'operatore @@delete@@ ogni qualvolta che si dichiara un pointer lo si pone a NULL. (La cancellazione di un pointer nulla non da alcun problema). Inoltre se il puntatore
08/06/2006 ore 10:26 CEST di 193.204.249.156 -
Modificata la linea 53: da:
!Type definition Struct vs Class
a:
!!Type definition Struct vs Class
Modificate le linee 120-191: da:
# L'utilizzo del metodo setTime permette di gestire correttamente l'assegnazione dei valori evitando error-type e error-range.
a:
# L'utilizzo del metodo setTime permette di gestire correttamente l'assegnazione dei valori evitando error-type e error-range.

!! Using construtctor
Nella programmazione orientata agli oggetti, i costruttori sono metodi associati alle classi che hanno lo scopo di inizializzare le nuove istanze della classe durante il processo di creazione. In molti linguaggi (per esempio in Java e C++) hanno lo stesso nome della classe a cui appartengono. Come tutti gli altri metodi, i costruttori possono essere definiti in molteplici versioni attraverso overloading.



''//Interface''
Time(); // default constructor
Time(int hr);
Time(int hr, int min, int sec);
''//Implementation''
Time::Time(){ hour = minute = second = 0; }
Time::Time(int hr) { setTime(hr, 0, 0); }
Time::Time(int hr, int min, int sec)
{ setTime(hr, min, sec); }

Time t1;
Dichiaro un oggetto t1. In questo caso viene richiato il costruttore di default.

Time t2(08);
Time t2 = Time(08);
Time t2 = 08;
Time t2 = (Time) 08;

ottenuta dall'invocazione di @@Time(08)@@.


Time t3(08,15,04);
Time t3 = Time(08,15,04);

Per quanto rigurada l'allocazione dinamica...
@@Type_name * pointer_name = new Type_name;@@
Time *t;
t = new Time; // Time() is invoked
t = new Time(08); // Time(int) is invoked
t = new Time(08,15,04); // Time(int, int, int) is invoked

Come vettore...\\
@@Time arrayOfTimes[8] = { 3, Time(05), Time(),Time(01,12,03)}@@
Per le celle valgono le regole definite precedentemente.

e come vettore dinamico....\\
@@Time *t = new Time[x];@@

!!!Inizializzazione del costruttore



!!Distruttore


Infine, anche i distruttori, quando non vengono definiti esplicitamente, vengono creati automaticamente dal compilatore (distruttore di default).

!!Operatori new e delete


Per deallocare la memoria dell'area heap in C++ mette a disposizione l'operatore delete. Questo operatore non restituisce alcun valore e quindi deve essere usato da solo in un'istruzione.
Il prototipo dell'operatore delete si presenta in questo modo:
@@delete nome_puntatore@@




float* punt = new float [100] ; // alloca 100 oggetti float
delete [] punt; // libera tutta la memoria allocata



int* punt = new int; // alloca un int nell'area heap
int a;
08/06/2006 ore 09:43 CEST di 193.204.249.156 -
Modificate le linee 10-11: da:
Non dovrebbe sorprendere di tanto il fatto che il C++ abbia un'origine simile al C. Lo sviluppo del linguaggio C++ all'inizio degli anni Ottanta dovuto a Bjarne Stroustrup dei laboratori Bell (Stroustrup ammette che il nome di questo nuovo linguaggio dovuto a Rick Mascitti). Originariamente il C++ era stato sviluppato per risolvere alcune simulazioni molto rigorose e guidate da eventi; per questo tipo di applicazione la scelta della massima efficienza precludeva l'impiego di altri linguaggi.
a:
Non dovrebbe sorprendere di tanto il fatto che il C++ abbia un'origine simile al C. Lo sviluppo del linguaggio C++ all'inizio degli anni Ottanta dovuto a Bjarne Stroustrup dei laboratori Bell (Stroustrup ammette che il nome di questo nuovo linguaggio dovuto a Rick Mascitti). Originariamente il C++ era stato sviluppato per risolvere alcune simulazioni molto rigorose e guidate da eventi; per questo tipo di applicazione la scelta della massima efficienza precludeva l'impiego di altri linguaggi.
Modificata la linea 19: da:
Gli ADTs possono essere definito come un dato indipendente dalla sua rappresentazione interna e dalla effettiva
a:
Gli ADTs possono essere definiti come un dato indipendente dalla sua rappresentazione interna e dalla effettiva
Modificate le linee 51-120: da:
Il concetto di ''abstraction'' sta ad indicare che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni. Abstracti
a:
Il concetto di ''abstraction'' sta ad indicare che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni.

!Type definition Struct vs Class
Questo esempio realizzato tramite il costrutto struct vuole mettere in evidenza le problematiche relative all'utilizzo delle strutture in un linguaggio imperativo come il C.

// Create a structure, set its members, and print it
#include <iostream.h>
struct Time { // structure definition
int hour; // 0-23
int minute; // 0-59
int second; // 0-59
};
void printMilitary(const Time &); // prototype
void printStandard(const Time &); // prototype

//===========================================
main()
{
Time dinnerTime; // variable of new type Time
// set members to valid values
dinnerTime.hour = 18;
dinnerTime.minute = 30;
dinnerTime.second = 0;
cout << "Dinner will be held at";
printMilitary(dinnerTime); // 18:30:00

// set members to invalid values
dinnerTime.hour = 29;
dinnerTime.minute = 73;
dinnerTime.second = 103;
cout << "\nTime with invalid values: ";
printMilitary(dinnerTime); // 29:73:103 bad values!
}

E' possibile assegnare agli attributi della struttura qualsiasi valore. (non type-safe).
Non esiste il concetto di interfaccia, infatti se l'implementazione della struttura cambia, anche il programma deve subire un riadattamento.

Ecco la stessa soluzione ottunuta tramite l'implentazione della classe Time
#include <iostream.h>
// Time abstract data type (ADT) definition
class Time {
public:
Time(); // default constructor
void setTime(int, int, int);
void printMilitary();
void printStandard();
private:
int hour; // 0 - 23
int minute; // 0 - 59
int second; // 0 - 59
};

// Time constructor initializes each data member to zero.
// No return value
// Ensures all Time objects start in a consistent state.
Time::Time() { hour = minute = second = 0; }

// Set a new Time value using military time.
// Perform validity checks on the data values.
// Set invalid values to zero (consistent state)
void Time::setTime(int h, int m, int s)
{
hour = (h >= 0 && h < 24) ? h : 0;
minute = (m >= 0 && m < 60) ? m : 0;
second = (s >= 0 && s < 60) ? s : 0;
}

# @@hour@@, @@minute@@, e @@second@@ sono membri privati e quindi non accedibili dall'esterno. [Information Hiding]

# L'utilizzo del metodo setTime permette di gestire correttamente l'assegnazione dei valori evitando error-type e error-range.
Modificata la linea 2: da:
'''Autore:''' Estefan Civera\\
a:
'''Autore:''' [[Profiles.Estefan|Estefan Civera]]\\
Modificata la linea 51: da:
Il concetto di @abstraction@ sta ad indicare che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni. Abstracti
a:
Il concetto di ''abstraction'' sta ad indicare che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni. Abstracti
Modificate le linee 6-8: da:
->[-Scopo di questo articolo di fare una introduzione alla programmazione ad oggetti in C++-]
a:
->[-Scopo di questo articolo di fare una introduzione alla programmazione ad oggetti in C++.-]
01/06/2006 ore 15:10 CEST di 193.204.253.17 -
Modificate le linee 46-55: da:


Comunque
il C++ presenta anche degli aspetti negativi (come ogni linguaggio), in parte ereditate dal C:

* La potenza e
la tipiche del C e del C++ non sono gratuite. Se da una parte e` vero che e` possibile ottenere applicazioni in generale piu` efficienti (rispetto ad agli altri linguaggi), e anche vero che tutto questo e` ottenuto lasciando in mano al programmatore molti dettagli e compiti che negli altri linguaggi sono svolti dal compilatore; e` quindi necessario un maggiore lavoro in fase di progettazione e una maggiore attenzione ai particolari in fase di realizzazione, pena una valanga di errori spesso subdoli e difficili da individuare che possono far levitare drasticamente i costi di produzione;
* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
*Dipendenza del codice prodotto con l'architettura harware sottostante.
*Non esiste il garbage collector,ogni oggetto, variabile,... deve essere esplicitamente deallocata dal programmatore con problemi relativi alla consistenza e all'efficienza.
a:
*Come il C, anche il C++ ha una libreria standard. Di particolare importanza la STL, Standard Template Library, la parte della libreria standard che utilizza i template per implementare contenitori generici, come vettori, code, array associativi, e via. La programmazione ne risulta molto semplificata, al prezzo di un gran lavoro del compilatore per interpretare i complessi template.

!Classes and Data Abstraction

!!Abstraction
Il concetto di @abstraction@ sta ad indicare
che i dettagli implementativi vengono nascosti all'utente che interagisce con essi tramite metodi e funzioni. Abstracti
01/06/2006 ore 14:42 CEST di 193.204.253.17 -
Modificate le linee 36-39: da:
*Permette di realizzare qualsiasi cosa fattibile in C senza alcun overhead addizionale
*Estende le caratteristiche del C, rimediando almeno in parte alle carenze del suo predecessore (che manca soprattutto di un buon sistema dei tipi). In particolare l'introduzione di costrutti quali i Template e le Classi rende il C++ un linguaggio multiparadigma (con particolare predilezione per il paradigma ad oggetti e la programmazione generica);
*Possibilita` di portare facilmente le applicazioni verso altri sistemi;
a:
*Permette di realizzare qualsiasi cosa fattibile in C senza alcun overhead addizionale.
*Estende le caratteristiche del C, rimediando almeno in parte alle carenze del suo predecessore (che manca soprattutto di un buon sistema dei tipi) ad esempio con l'aggiunta dei tipi @bool@. In particolare l'introduzione di costrutti quali i Template e le Classi rende il C++ un linguaggio multiparadigma (con particolare predilezione per il paradigma ad oggetti e la programmazione generica).
Altre caratteristiche fondamentali che sono state inserite in C++ sono la gestione delle eccezioni, l'utilizzo del costruttore di copia, il passaggio per riferimento, e la gestione dell'ovrloading/overriding.
Modificate le linee 43-44: da:
* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non e` cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
La sempre maggiore diffusione del C++ sta comunque cambiando questa situazione ed e` prevedibile nei prossimi anni una sostanziale evoluzione di compilatori e linker, grazie anche alla recente adozione di uno standard.
a:
* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
*Dipendenza del codice prodotto con l'architettura harware sottostante.
*Non esiste il garbage collector,ogni oggetto, variabile,... deve essere esplicitamente deallocata dal programmatore con problemi relativi alla consistenza e all'efficienza.



Comunque il C++ presenta anche degli aspetti negativi (come ogni linguaggio), in parte ereditate dal C:

* La potenza e la tipiche del C e del C++ non sono gratuite
. Se da una parte e` vero che e` possibile ottenere applicazioni in generale piu` efficienti (rispetto ad agli altri linguaggi), e anche vero che tutto questo e` ottenuto lasciando in mano al programmatore molti dettagli e compiti che negli altri linguaggi sono svolti dal compilatore; e` quindi necessario un maggiore lavoro in fase di progettazione e una maggiore attenzione ai particolari in fase di realizzazione, pena una valanga di errori spesso subdoli e difficili da individuare che possono far levitare drasticamente i costi di produzione;
* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
*Dipendenza del codice prodotto con l'architettura harware sottostante.
*Non esiste il garbage collector,ogni oggetto, variabile,... deve essere esplicitamente deallocata dal programmatore con problemi relativi alla consistenza e all'efficienza.
31/05/2006 ore 20:45 CEST di Vincenzo - Aggiunta del testo del sommario, dell'autore e modifiche minori all'impaginazione
Modificata la linea 2: da:
'''Autore:''' ehi autore, scrivi qui il tuo nome :)\\
a:
'''Autore:''' Estefan Civera\\
Aggiunta la linea 4:
Modificate le linee 6-7: da:
->[]
a:
->[-Scopo di questo articolo di fare una introduzione alla programmazione ad oggetti in C++-]
Modificate le linee 43-45: da:
* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non e` cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
La sempre maggiore diffusione del C++ sta comunque cambiando questa situazione ed e` prevedibile nei prossimi anni una sostanziale evoluzione di compilatori e linker, grazie anche alla recente adozione di uno standard.
a:
* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non e` cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
La sempre maggiore diffusione del C++ sta comunque cambiando questa situazione ed e` prevedibile nei prossimi anni una sostanziale evoluzione di compilatori e linker, grazie anche alla recente adozione di uno standard.
Modificata la linea 1: da:
Object Oriented in C++
a:
!Object Oriented in C++
Aggiunte le linee 2-3:
'''Autore:''' ehi autore, scrivi qui il tuo nome :)\\
'''Hanno contribuito:'''
31/05/2006 ore 17:48 CEST di 193.204.253.17 -
Aggiunte le linee 29-41:
!!!Diffusione
Grazie ad un notevole sforzo da parte dei progettisti il C++ risultato uno tra i (se non il primo) linguaggi robusti ed efficienti. La notevole diffusione stata avvantaggiata anche dal fatto che
*Conserva una quasi assoluta (alcune cose sono diverse) con il suo diretto antenato, il C, da cui eredita la sintassi e la semantica per tutti i costrutti comuni, oltre alla notevole e potenza.
*Permette di realizzare qualsiasi cosa fattibile in C senza alcun overhead addizionale
*Estende le caratteristiche del C, rimediando almeno in parte alle carenze del suo predecessore (che manca soprattutto di un buon sistema dei tipi). In particolare l'introduzione di costrutti quali i Template e le Classi rende il C++ un linguaggio multiparadigma (con particolare predilezione per il paradigma ad oggetti e la programmazione generica);
*Possibilita` di portare facilmente le applicazioni verso altri sistemi;

Comunque il C++ presenta anche degli aspetti negativi (come ogni linguaggio), in parte ereditate dal C:

* La potenza e la tipiche del C e del C++ non sono gratuite. Se da una parte e` vero che e` possibile ottenere applicazioni in generale piu` efficienti (rispetto ad agli altri linguaggi), e anche vero che tutto questo e` ottenuto lasciando in mano al programmatore molti dettagli e compiti che negli altri linguaggi sono svolti dal compilatore; e` quindi necessario un maggiore lavoro in fase di progettazione e una maggiore attenzione ai particolari in fase di realizzazione, pena una valanga di errori spesso subdoli e difficili da individuare che possono far levitare drasticamente i costi di produzione;

* Il compilatore e il linker del C++ soffrono di problemi relativi all'ottimizzazione del codice dovuti alla falsa assunzione che programmi C e C++ abbiano comportamenti simili a run time: il compilatore nella stragrande maggioranza dei casi si limita ad eseguire le ottimizzazioni tradizionali, sostanzialmente valide in linguaggi come il C, ma spesso inadatte a linguaggi pesantemente basati sulla programmazione ad oggetti; il linker poi da parte sua non e` cambiato molto e non esegue alcune ottimizzazioni che non sono fattibili a compile-time.
La sempre maggiore diffusione del C++ sta comunque cambiando questa situazione ed e` prevedibile nei prossimi anni una sostanziale evoluzione di compilatori e linker, grazie anche alla recente adozione di uno standard.
31/05/2006 ore 17:34 CEST di 193.204.253.17 -
Aggiunte le linee 1-28:
Object Oriented in C++
->'''Sommario'''
->[]

!!Storia




Il C++ consente lo sviluppo di software su larga scala. Grazie a un maggiore rigore sul controllo dei tipi, molti degli effetti collaterali tipici del C, divengono impossibili in C++.



!!!Abstract data type
Gli ADTs possono essere definito come un dato indipendente dalla sua rappresentazione interna e dalla effettiva
implementazione delle operazioni su tale dato. Viene definito specificando:
rappresentazione interna e dalla effettiva
*implementazione delle operazioni su tale dato
*viene definito specificando:
*un insieme di valori, detto dominio del tipo di dato
*un nome con cui si indica il dominio
*un insieme di funzioni che opera sul dominio
*costruttori
*operatori
*predicati
*un insieme di costanti appartenenti al dominio

A differenza del C, il C++ permette la gestione degli ADTs (concetto realizzato dal costrutto @@class@@)
Modifica - Versioni - Stampa - Modifiche recenti - Cerca
Ultima modifica il 02/08/2006 ore 23:17 CEST