Dal C al C++/Utilizzo basilare di librerie/L'uso di classi e oggetti: differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
G4Bot (discussione | contributi)
m Bot: Aggiungo: "{{Avanzamento|75%}} "
Nessun oggetto della modifica
Riga 4:
 
Si consideri la seguente porzione di codice in linguaggio C:
 
struct S1 {
<source lang=c>
int i;
struct S1 {
double x;
} int i;
double x;
};
struct S1 a1 = { 2, 3.14 };
</source>
Le prime 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".
Le prime quattro righe definiscono un nuovo ''tipo'', chiamato "<code>struct S1"</code>.
L'ultima riga definisce una variabile, di nome "<code>a1"</code>, di tipo "<code>struct S1"</code>, e inizializzata con i due valori "<code>2"</code> e "<code>3.14"</code>.
 
Nel linguaggio C++ la possibilità di definire nuovi tipi è stata estesa con l'aggiunta delle "funzioni membro".
Si consideri la seguente porzione di codice in linguaggio C++:
struct S2 {
int i;
double x;
double f() { return x * 2; }
};
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".
 
<source lang=cpp>
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''.
struct S2 {
int i;
double x;
double f() { return x * 2; }
};
struct S2 a2 = { 2, 3.14 };
</source>
 
Rispetto al codice precedente, è stata aggiunta solo la quarta riga, in cui si definisce una funzione di nome "<code>f"</code>, che non prende parametri, e che rende un valore di tipo "<code>double"</code>.
Tale funzione è stata definita all'interno della struttura "<code>struct S2"</code>.
 
Così come le variabili definite all'interno di una struttura, oltre ad essere dette i ''campi'' della struttura, sono anche dette essere le sue ''variabili membro'', così le funzioni definite all'interno di una struttura sono dette essere le sue ''funzioni membro''.
In generale, variabili membro e funzioni membro sono i ''membri'' di una struttura.
 
Si noti che "<code>f"</code> non è un puntatore a funzione, ma è proprio una funzione, con tanto di corpo.
Forse qualcuno si chiederà: "Ma allora la struttura "<code>a2"</code> contiene il codice macchina della funzione o solo il suo indirizzo?".
 
La risposta è che non contiene nessuno dei due.
 
Quando il compilatore elabora la definizione di <code>struct S2</code> non alloca spazio di dati, in quanto si tratta solo di un tipo.
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".
Quando invece elabora la definizione di <code>a2</code> alloca una struttura contenente i due soli membri dato.
La compilazione della funzione "<code>f"</code> genera del codice macchina, che è memorizzatamemorizzato nel segmento di codice del programma, quindi ben lontano dalla variabile "<code>a2"</code> e da ogni altra istanza del tipo "<code>struct S2"</code>.
 
A fronte di una tale dichiarazione diTale funzione, il compilatoremembro genera pressapoco lo stesso codice che genererebbe quando compilasse il seguente codice in linguaggio C:
 
<source lang=c>
double S2_f(const struct S2 * t) { return t->x * 2; }
</source>
 
Il nome della funzione "<code>S2_f"</code> indica semplicemente che tale funzione è distinta da eventuali altre funzioni di nome "<code>f"</code> dichiarate fuori dalla struttura.
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 è distinta da eventuali altre funzioni di nome "f" dichiarate fuori dalla struttura.
 
Il parametro "<code>t"</code> è un puntatore a unaun variabileoggetto avente lo stesso tipo della struttura.
 
La variabile "<code>x"</code>, indicata come variabile non qualificatache nel corpo originale della funzione era indicata come variabile non qualificata, è diventata un membro della struttura puntata da "<code>t"</code>.
 
La variabile "a2" ha la stessa dimensione e lo stesso contenuto della variabile "a1".