Dal C al C++: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Riga 164:
};
struct S1 a1 = { 2, 3.14 };
Le primaprime quattro righe definiscono un nuovo ''tipo'', chiamato "struct S1".
L'ultima riga definisce una variabile, di nome "a1", di tipo "struct S1", e inizializzata con i due valori "2" e "3.14".
 
Riga 175:
};
struct S2 a2 = { 2, 3.14 };
Rispetto al codice precedente, è stata aggiunta solo la quarta riga, in cui si definisce una funzione di nome "f", che non prende parametri e che rende un valore di tipo "double".
Tale funzione è stata definita all'interno della struttura "struct S2".
Così come le variabili definite all'interno di una struttura sono dette essere le sue ''variabili membro'', così le funzioni definite all'interno di una struttura sono dette essere le sue ''funzioni membro''.
Riga 184:
La risposta è che non contiene nessuno dei due.
La funzione "f" è memorizzata nel segmento di codice del programma, quindi ben lontano dalla variabile a2 e da ogni altra istanza del tipo "struct S2".
 
A fronte di una tale dichiarazione di funzione, il compilatore genera pressapoco lo stesso codice che genererebbe quando compilasse il seguente codice in linguaggio C:
double S2_f(const struct S2 * t) { return t->x * 2; }
Il nome della funzione "S2_f" indica semplicemente che tale funzione nonè verràdistinta confusa conda eventuali altre funzioni di nome "f" dichiarate fuori dalla struttura.
Il parametro "t" è un puntatore a una variabile avente lo stesso tipo della struttura.
La variabile "x" indicata nel corpo originale della funzione, è diventata un membro della struttura puntata da "t".
Line 194 ⟶ 195:
Vediamo infine come si invoca la funzione "f":
double y = a2.f();
L'operatore ".", come consente di accedere alle variabili membro, così contente di accedere alle funzioni membro, chiamandole.
Il codice generato dalla riga qui sopra è equivalente a quello generato dalla seguente riga:
double y = S2_f(&a2);
Quindi chiamare una funzione membro su una variabile di tipo struttura, significa chiamare la funzione passandole come primo parametro un puntatore alla variabile stessa.
 
Vediamo un esempio realistico basato sulla classe "string".
string s = "ABCDEFG";
cout << s.substr(4, 2);
Questa porzione di codice stampa sulla console la stringa "EF", in quanto la funzione membro "substr" estrae dalla stringa "s" una sottostringa saltando 4 caratteri da sinistra e prendendone 2.
 
"substr" è una funzione membro della classe "string", quindi riceve implicitamente come primo parametro nascosto un puntatore alla stringa a cui la funzione viene applicata.
Inoltre, tale funzione accetta due parametri interi; il primo è il numero di caratteri da contare a partire dall'inizio della stringa, e il secondo è il numero di caratteri da prelevare.
Il valore reso dalla funzione è ovviamente un altro valore di tipo "string".
 
Il C++ introduce rispetto al C alcune comodità sintattiche:
* Il nome del tipo della variabile a2 può essere "struct S2", ma può essere abbreviato in "S2".
* La parola-chiave "class" è ''quasi'' sinonima di "struct", ed è molto più usata per strutture contenenti funzioni membro. D'ora in poi, invece di "struct", e ''struttura'' useremo prevalentemente "class" e ''classe''. Quindi una variabile "x" di tipo "class C" potrà essere definita semplicemente con la seguente riga:
C x;
 
{{wikipedia|titolopedia=C plus plus|titolobooks=il linguaggio C++}}