Vai alla Home Page About me Courseware Federica Living Library Federica Federica Podstudio Virtual Campus 3D Le Miniguide all'orientamento Gli eBook di Federica La Corte in Rete
 
 
Il Corso Le lezioni del Corso La Cattedra
 
Materiali di approfondimento Risorse Web Il Podcast di questa lezione

Salvatore Cuomo » 17.Il linguaggio c++ parte prima


Dal C al C++

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.

Esempio 1

C vs C++

C vs C++


Dal C al C++

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’)_

Dal C al C++

Input ed Output

La fase di input viene così gestita:

  • In C: scanf(“%s”,s);
  • In C++: cin >> s;
  • La fase di output viene così gestita:
  • In C: printf(“Ciao %s\n”,s);
  • In C++: cout << “Ciao” << s << endl;

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.

Dal C al C++

Blocchi di istruzioni

  • Le istruzioni di un programma possono essere raggruppate in blocchi
  • I blocchi sono delimitati tra parentesi graffe

Visibilità delle variabili

Una variabile esiste dal momento della dichiarazione fino

  • alla chiusura del blocco di istruzioni in cui è stata dichiarata
  • ogni variabile è accessibile soltanto nel blocco in cui è dichiarata ed in tutti i blocchi interni ad esso.

Nella figura mostrata la variabile a non + puù visibile all’esterno del riquadro.

Visibilità di variabili

Visibilità di variabili


Dal C al C++

Dichiarazione della variabili nei cicli

  • Le variabili possono essere dichiarate anche all’interno di un ciclo
  • In questo modo la variabile viene allocata soltanto durante l’esecuzione del ciclo
  • Una volta concluso il ciclo la variabile non è più accessibile

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.

Caratteristiche C++ 1

Caratteristiche C++ 1

Caratteristiche C++ 2

Caratteristiche C++ 2


Dal C al C++

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];

Caratteristiche C++ 3

Caratteristiche C++ 3

Caratteristiche C++ 4

Caratteristiche C++ 4


Dal C al C++

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

Caratteristiche C++ 5

Caratteristiche C++ 5

Caratteristiche C++ 6

Caratteristiche C++ 6


Dal C al C++

Allocazione dinamica

Quando si utilizza l’allocazione dinamica è bene rispettare alcune regole basilari:

  • È buona pratica non utilizzare nello stesso programma allocazioni fatte con new e malloc
  • Le allocazioni prodotte da new non possono essere liberate mediante free
  • Deallocare un array con delete invece di delete[ ] genera un errore

In 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.

Principali innovazioni nel C++

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:

  • Se viene invocata con 4 parametri dist(x1,y1,x2,y2) fornisce la distanza tra i punti di coordinate (x1,y1) e (x2,y2)
  • Mentre se viene invocata con 2 parametri dist(x1,y1) fornisce la distanza del punto (x1,y1) dall’origine (x2=0, y2=0)‏
Retta.

Retta.

Retta origine.

Retta origine.


Principali innovazioni nel C++

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.

Inline

Inline


Principali innovazioni nel C++

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:

  • un intero
  • un reale (float)
  • un reale a doppia precisione (double)
Overloading 1

Overloading 1


Principali innovazioni nel C++

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

Overloading 2

Overloading 2


Esempi di overloading

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);

Riferimento

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.

Riferimento

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.

Passaggio par C++

Passaggio par C++

Passaggio par C

Passaggio par C


Passaggio per riferimento

Passaggio di Parametri

Passaggio di Parametri


Esempio

Esercizio

Si scriva un programma in C++ per il calcolo della Trasposta di una matrice quadrata A.

Codice_Cpp_1

Codice_Cpp_1


Esempio

Esercizio

Il programma è composto in maniera modulare da

Due funzioni una per il calcolo della matrice l’altra per la visualizzazione della funzione trasposta.

Codice_Cpp_2

Codice_Cpp_2

Codice_Cpp_3

Codice_Cpp_3


  • Contenuti protetti da Creative Commons
  • Feed RSS
  • Condividi su FriendFeed
  • Condividi su Facebook
  • Segnala su Twitter
  • Condividi su LinkedIn
Progetto "Campus Virtuale" dell'Università degli Studi di Napoli Federico II, realizzato con il cofinanziamento dell'Unione europea. Asse V - Società dell'informazione - Obiettivo Operativo 5.1 e-Government ed e-Inclusion