Il C++ è un linguaggio di programmazione orientato agli oggetti. Fu sviluppato con il nome di “C con classi” da Bjarne Stroustrup nei Bell Labs nel 1983 come un miglioramento del linguaggio C.
È possibile scrivere programmi C validi anche come programmi C++, anche se il C non è un sottoinsieme del C++ .
Il C++ oggi è uno dei linguaggi di programmazione più diffusi e apprezzati. La semantica del C++ è molto ricca di dettagli e sfumature che condizionano lo sviluppo del codice ed è disponibile un insieme di librerie molto vasto.
Tra i compilatori di tipo gratuito per C++ ci sono: GCC disponibile per molte piattaforme diverse, MinGW porting di GCC per ambienti Windows, e DJGPP. Oltre a questi ci sono i compilatori commerciali come VisualC++ e il compilatore di Borland C++ Builder.
Il C++ è un estensione del C ed è dunque sempre possibile compilare un programma C mediante un compilatore C++.
Gli esempi che seguono sono volti ad analizzare le differenze sintattiche tra i due linguaggi.
Commenti
In C++ viene introdotto un nuovo tipo di commento mediante // che delimita l’inizio di un commento che finisce al termine della linea
int dim;
// Chiedo la dimensione del problema
cout << “Introduci il numero di \
Input ed Output
L’header file per la gestione dell’input ed output stdio.h
viene sosntituito in C++ da iostream
In C++ al posto delle funzioni definite da stdio.h, printf e scanf
è preferibile utilizzare cin e cout con gli operatori ” >> " e " << "
…
cout << “Introduci il numero di \
elementi da sommare” << endl; cin >> dim ;
endl
viene utilizzato per indicare il carattere di terminazione della linea in alternativa a (‘\n’)_
Input ed Output
La fase di input viene così gestita:
Dichiarazioni delle variabili locali
Le variabili possono essere dichiarate in qualsiasi punto del programma e non devono essere necessariamente elencate all’inizio.
…
// Chiedo di inserire gli elementi
float a, tot=0;
cout<<”Introduci gli elementi”<
…
è buona norma dichiarare una variabile lì dove si comincia ad usarla poiché questo rende il codice più leggibile.
Blocchi di istruzioni
Visibilità delle variabili
Una variabile esiste dal momento della dichiarazione fino
Nella figura mostrata la variabile a non + puù visibile all’esterno del riquadro.
Dichiarazione della variabili nei cicli
Nella figura mostrata la variabile a non è più visibile all’esterno dell ciclo..
Variabili con lo stesso nome
Una conseguenza della visibilità è la possibilità di utilizzare un stesso nome di variabile in più blocchi potendolo associare anche a diversi tipi.
Allocazione dinamica
Anche in C++ come in C è possibile allocare e liberare locazione di memoria in base alle necessità.
A tale scopo vengono utilizzate le funzioni new
e delete
che rimpiazzano rispettivamente malloc
e free
Sintassi di new
new
si utilizza per l’allocazione e l’inizializzazione di variabili con la sintassi:
char *ptr;
…
ptr= new char(‘c’);
e per l’allocazione di array con la sintassi:
float *arr;
…
arr= new float[dim];
Sintassi di delete
delete
si utilizza per rilasciare l’aria di memoria di una variabile allocata tramite new con la sintassi:
ptr= new char(‘c’);
…
delete ptr;
Per librare un array invece è necessario utilizzare la sintassi:
arr= new float[dim];
…
delete[ ] arr;
A differenza di quanto succedeva con malloc,
new
associa una quantità di memoria della dimensione appropriata senza dover utilizzare sizeof
Allocazione dinamica
Quando si utilizza l’allocazione dinamica è bene rispettare alcune regole basilari:
new
e malloc
delete
[ ] genera un erroreIn generale, sebbene sia possibile utilizzare la sintassi del C all’interno dei programmi C++ è buona regola utilizzare i costrutti del C++ perché sono estensibili e effettuano controlli sui tipi.
Parametri predefiniti per le funzioni
E’ possibile definire parametri predefiniti nelle testata delle funzioni:
inline double dist(double x1,double y1,double x2=0,double y2=0)
{
return sqrt(pow((x1-x2),2)+pow((y1-y2),2));
}
La funzione dist
così definita può essere invocata sia specificando 4 che 2 parametri. In particolare:
dist(x1,y1,x2,y2)
fornisce la distanza tra i punti di coordinate (x1,y1) e (x2,y2)dist(x1,y1)
fornisce la distanza del punto (x1,y1) dall’origine (x2=0, y2=0)Funzioni di tipo inline
In C++ è possibile definire una funzione di tipo:
inline
Quando una funzione è dichiara inline il compilatore sostituisce la chiamata alla funzione con le istruzioni in essa contenute.
Questo può comportare un miglioramento delle performance del programma a scapito della grandezza dell’eseguibile prodotto
La figura seguente mostra questo procedimento.
Overloading di funzioni
In C++ è possibile definire più funzioni con lo stesso nome purché accettino diversi argomenti in input.
Facciamo un esempio definiamo tre funzioni isnull
che accettano come argomento rispettivamente:
Overloading di funzioni
Questo risulta molto utile nel caso di funzioni hanno fini simili ma compiono diverse operazioni perché operano su argomenti di tipo diverso.
Al momento della chiamata il compilatore stabilisce quale funzione invocare in base all’argomento. Ad esempio
…
int i,ai;
float f,af;
double d,ad;
…
ai=isnull(i); // esegue le funzione 1
af=isnull(f); // esegue la funzione 2
ad=isnull(d); // esegue la funzione 3
Supponiamo di sviluppare una funzione somma di due numeri che potranno essere reali o interi.
per sommare due interi: int Sum(int a, int b);
2. Pre sommare due float: float Sum(float a, float b);
3. per sommare un float ed un intero:
float Sum(float a, int b);
float Sum(int a, float b);
4. Per sommare un intero ed un float: void Sum(int a, float f);
5. Per sommare e ritornare un char: char Sum( );
Attenzione non è possibile definire int Sum(int a, float f) perché già precedentemente definita e ritorna tipi di dati diversi!
In alcune vecchie versioni del C++ l’intenzione di sovraccaricare una funzione doveva essere esplicitamente comunicata al compilatore tramite la keyword overload. Ad esempio
overload Sum; // ora si può sovraccaricare Sum:
int Sum(int a, int b);
float Sum(float a, float b);
In C++ è possibile definire un riferimento ad una variabile
Un riferimento va considerato come un secondo nome per la variabile. Ad esempio
int ix; //ix è una variabile reale
int &rx=ix; //rx è un riferimento per ix
ix =1; // anche rx vale 1
rx =2; // anche ix vale 2
Ogni volta che si accede ad un riferimento si accede all’area di memoria associata alla variabile.
Passaggio per riferimento
Generalmente i riferimenti vengono utilizzati nelle testate delle funzioni perché risolvono i problemi del passaggio per valore del C
Con il passaggio per riferimento all’interno della funzione si utilizzano direttamente i parametri della testata senza usare l’operatore * come nel C
La figura mette in evidenza questo aspetto.
Nella chiamata della funzione scambia in C++ non sarà più necessario utilizzare l’operatore & come facevamo in C.
Esercizio
Si scriva un programma in C++ per il calcolo della Trasposta di una matrice quadrata A.
1. Prolusione
2. Sistemi Operativi – parte prima
3. Sistemi Operativi – parte seconda
6. Il linguaggio C – parte prima
8. Il linguaggio C – funzioni e puntatori
10. Il linguaggio C – parte terza
11. La documentazione del software
12. Dati strutturati
13. Esercizi sui dati strutturati
14. Approfondimenti di C, Stringhe e file
15. Esercizi su stringhe e file
16. La ricorsione
17. Il linguaggio c++ parte prima
18. Il linguaggio C++ - parte seconda
19. Strutture dati di tipo astratto
Incompatibilità tra C e C++(in Inglese)