Categorie
Winzipedia Uso dell'wiki |
ObjectOrientedCppInformatica3.ObjectOrientedCpp VersioniNascondi 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 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 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 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 - 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 - Correzioni ortografiche
Modificate le linee 288-289: da:
# # 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 - Template e STL
Modificate le linee 295-299: da:
[[Attach:C++SecondaParte.pdf | Seconda parte]] Nell'ottimo riassunto di Estefan manca la parte sull' ->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 - 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 - 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 - 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 - 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). 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;}@@ a:
@@inline int sum(int a, int b){return a+b;}@@ Modificata la linea 287: da:
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) 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 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; } } 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:
a:
!!Abstract data type Modificate le linee 46-47: da:
!! a:
!!Diffusione del linguaggio Cancellate le linee 61-62:
Modificate le linee 177-181: da:
a:
!!Inizializzazione del costruttore 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' 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 * 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 *Dipendenza del codice prodotto con l'architettura 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 a:
Ecco la stessa soluzione ottenuta tramite l'implementazione della classe Time Modificata la linea 119: da:
# L'utilizzo del 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 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 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 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 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; Modificate le linee 184-191: da:
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 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 Modificata la linea 53: da:
!Type definition Struct vs Class a:
!!Type definition Struct vs Class Modificate le linee 120-191: da:
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; 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 a:
Gli ADTs possono essere definiti come un dato indipendente dalla sua rappresentazione interna e dalla effettiva Modificate le linee 51-120: da:
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 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++.-] Modificate le linee 46-55: da:
Comunque * La potenza e * 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 Modificate le linee 36-39: da:
*Permette di realizzare qualsiasi cosa fattibile in C senza alcun overhead addizionale *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 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 - Aggiunta del testo del sommario, dell'autore e modifiche minori all'impaginazione
Modificata la linea 2: da:
'''Autore:''' 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:
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:''' 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. 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@@) |