The C++ Compass

The C++ Compass
>FAQ<

FAQ

Home
Home

Risorse
Risorse

Utilities
Utilities

Compilatori
Compilatori

GUI Toolkits
GUI Toolkits

Libri
Libri

Download
Download

FAQ
FAQ



whoami
Who am I
[Precedente] [Indice] [Successiva]


[Classi]


Cosa sono le classi e quali sono le principali caratteristiche del linguaggio C++ ?

Una "classe" C++ e` un TIPO (astratto o concreto), che puo` raggruppare astrazioni di IDENTITA`, STATO, e COMPORTAMENTO (ciascuna di queste astrazioni potrebbe non essere presente in una data classe); una classe concreta permette di avere delle ISTANZE, dette OGGETTI "appartenenti" a quella classe (cioè, a quel tipo); una classe astratta permette di avere dei RIFERIMENTI ad istanze di opportune classi concrete che soddisfano la relazione di E'-UN ("is-A") rispetto alla classe astratta. Una data classe può essere simultaneamente concreta ed astratta (per questo si denominano anche "classi astratte PURE" quelle che concrete non sono, cioè che non permettono di avere istanze ma solo riferimenti).

Il C++ offre vari altri strumenti per definire tipi che classi non sono, ed è anche possibile usare una classe in un modo che NON definisce un tipo (uso abbastanza frequente in codice C++ antico, prima che nel linguaggio si aggiungesse il concetto di "spazio-dei-nomi"). Una classe può inoltre essere parametrizzata ("generica") rispetto a parametri-tipo, e/o a parametri-costanti, col meccanismo dei "template".

Una classe C++ permette di definire in modo articolato la accessibilità differenziata alle sue "feature" (dette anche suoi "membri"): alcune di esse possono essere riservate "per uso interno" (accessibili solo da parte dell'implementazione della classe stessa, ovvero "private"), altre possono essere "pubbliche", ed esiste una terza categoria intermedia, le feature "protette", comoda per l'implementazione della relazione di E'-UN attraverso il meccanismo della "eredità" (una classe C++ può "ereditare" da zero o piu` altre classi -- in modo pubblico, privato, o protetto, e, considerazione separata, in modo concreto o virtuale -- e questo ha tutta una serie di implicazioni relative alla classe stessa e all'uso che si può fare di riferimenti a sue istanze).

Gli elementi fondamentali della programmazione in C++ in ordine decrescente di importanza sono:
  1. C++ è un linguaggio MULTI-PARADIGMA: supporta, cioè, molteplici approcci diversi, e ortogonali fra loro, all'impostazione di un programma.
    Questo lo rende spaventosamente potente, e spaventosamente complicato. Un programma C++, quasi sempre, utilizza molteplici paradigmi (non necessariamente tutti quelli che il linguaggio supporta, naturalmente, sono usati in ogni singolo programma). Il "filo rosso" che unisce fra loro tutti i molteplici paradigmi può essere considerato quello della "correttezza dei tipi": il linguaggio permette al programmatore di violare esplicitamente la correttezza dei tipi, ma fa del suo meglio per consentire anche di rispettarla, coi due benefici di "controlli a tempo di compilazione" e "efficienza massimale a tempo di esecuzione".

  2. Paradigma procedurale: un programma C++ può fare pieno uso dei concetti tipici dei linguaggi procedurali (funzioni, variabili, espressioni, istruzioni, strutture di controllo, ...); il sottoinsieme procedurale del C++ è praticamente coincidente con il linguaggio C, con un minimo di cose in più relativamente alla correttezza dei tipi.

  3. Paradigma "uso di libreria standard": il C++ mette a disposizione dei programmi una libreria standard, molto potente e ottimizzata, per un certo insieme di funzionalità (che NON comprendono alcune cose importantissime, come la grafica, l'accesso a database, l'accesso alla rete, e tante altre interazioni col sistema): tipi di dati (ad esempio, stringhe di caratteri, numeri complessi, array-computazionali), contenitori parametrizzati (vettori, liste, code, insiemi, mappe), algoritmi, strutture di input/output formattato. Questa libreria standard non è "vasta" (rispetto ad esempio a quella di Java), cioè non copre moltissime aree di grande importanza, ma, per le aree che copre, offre una profondità (completezza, riusabilità, estensibilità) veramente inusitate. Quasi tutti i linguaggi offrono "qualcosa" del genere (su scala più ridotta), ma la specificità del C++ e` che tutto quanto sub 2 è implementato nel linguaggio stesso usando gli altri paradigmi qui elencati, e quindi può, in modo veramente "totale", essere esteso ed arricchito. L'uso assai vasto di parametrizzazioni (template) nella libreria standard consente di ottenere queste ricche funzionalità nel pieno rispetto della correttezza dei tipi.

  4. Paradigma "estensioni fuoribordo": il C++ permette di interfacciare con grande facilità librerie "esterne" al linguaggio (il termine di "fuoribordo" rende bene l'idea), più o meno standardizzate, per l'accesso a tutte quelle funzioni che [3] non copre -- database relazionali, reti, grafica, matematica avanzata, interazioni col sistema, eccetera.

  5. Paradigma "ad oggetti": il C++ permette di fare pieno uso del paradigma ad oggetti (polimorfismo) -- per ragioni storiche, questo paradigma ha colpito molti osservatori al punto che lo piazzerebbero "al primo posto" nell'elenco degli "elementi fondamentali", ignorando il fatto che [1..4] sono più importanti, e [6] quasi altrettanto importante. La programmazione ad oggetti in C++ e` ottenuta nel pieno rispetto della correttezza dei tipi.

  6. Paradigma "generico": il C++ permette di fare pieno uso del paradigma "generic programming" (programmazione parametrizzata) -- la libreria standard [cfr 3], ad esempio, si basa su [6] ancora più di quanto non si basi su [5] (anche [2] è cruciale, naturalmente, e [4] gioca il suo ruolo, il che, tutto assieme, dimostra che [1] è proprio IL punto cruciale. L'approccio C++ alla genericità è legato alla correttezza dei tipi e va nella stessa direzione (fare tutto il possibile a tempo di compilazione, non a tempo di esecuzione, per garantire un buon livello di controllo degli errori "anticipato", E l'efficienza ottimale a tempo di esecuzione).

  7. Paradigma "tipi di dati astratti": molti ignorano la potenza intrinseca di ADT, e sussumerebbero [7] sub [5], ma sarebbe altrettanto sbagliato che, ad esempio, sussumere [6] sub [2]. C++ contiene vari elementi che con [5] c'entrano sino ad un certo punto (Java, ad esempio, per cui la programmazione ad oggetti E` veramente centrale, ne manca), come la definibilità di assegnazioni e copie, che sono nel linguaggio proprio per supportare [7] in modo più ricco e completo (nell'ottica, manco a dirlo, della correttezza dei tipi.

  8. Paradigma "dinamico": C++ ha un supporto "minimale" per gli approcci dinamici, noto normalmente come "identificazione dei tipi a tempo di esecuzione" (RTTI: run-time type identification), che consente di implementare (alla [4]...) strutture dinamiche più ricche minimizzando le (inevitabili) violazioni della correttezza dei tipi implicite in questo dinamismo.

  9. Varie ed eventuali: il C++ è pieno zeppo di piccoli dettagli, da non trascurare, la maggior parte dei quali può essere riportata ai vari tipi di funzionalità previsti da [1..8] (alcuni, in realtà, hanno ragioni d'esistere puramente "storiche", ma anche essi contribuiscono fortemente, grazie alla compatibilità col passato che garantiscono, a supportare, in particolare, [4]).




Ultimo aggiornamento : 03/07/2000

email webmaster@thecppcompass.org