Lezione 4 - 13/03/2026
compoE:\Laurea Magistrale\SDTRA - Bevilacqua\Laboratori\Lezione 4 - 13-03-2026\Lezione_4_13032026.ccwen1
//Lezione 4 - 13/03/202623 /*Trasformiamo un codice funzionante da C a C++: leggivet, stampavet e raddoppiavet.*/45 /*La funzione di output è cout, quella di input cin.*/67 # include <iostream>8 using namespace std;910
Classe Vettore
class Vettore {11 private:12 int dim;13 int V[10];14 public:15 // Costruttore (spiegato dopo)16 Vettore() {17 cout << "Costruttore chiamato! Oggetto Vettore creato." << endl;18 }19 // Distruttore (spiegato dopo)20 ~Vettore() {21 cout << "Distruttore chiamato! Oggetto Vettore distrutto." << endl;22 }23 void leggidim(int);24 void stampadim();25 void leggivet();26 void raddoppiavet();27 void stampavet();28 };2930
/*Nel main devo stanziare il mio oggetto di classe vettore: sto istanziando l'oggetto "A" ad essere un oggetto di classe vettore.31 "A" porta le proprietà dell'oggetto in cui istanza; portandosi la sua componente dim e V, componenti di tipo attributo.*/3233
Funzione main
int main() {34 Vettore A;35 //A.dim=7; errata, perché dim è un elemento privato della classe vettore, pertanto inaccessibile al main, che non è funzione di classe36 A.leggidim(7); //è una chiamata di una funzione come metodo dell'oggetto A, di classe vettore37 A.stampadim(); //è una chiamata della funzione stampa come metodo della funzione A, di classe vettore38 A.leggivet();39 cout << "Vettore inserito: " << endl;40 A.stampavet(); //è una chiamata della funzione stampa come metodo della funzione A, di classe vettore41 A.raddoppiavet(); //è una chiamata della funzione doppio come metodo della funzione A, di classe vettore42 cout << "Vettore raddoppiato: " << endl;43 A.stampavet(); //è una chiamata della funzione stampa come metodo della funzione A, di classe vettore44 }A454647
//"leggivet" è una funzione pubblica che ha accesso alle variabili private di A.48 //Se vado a chiamare leggivet(), posso passargli un numero, es.7, ed è come se lo scrivo su A. Io voglio dare un valore alla componente di A49 void Vettore::leggidim(int A) {50 dim = A; //dim è una variabile privata, ma leggivet è una funzione pubblica che ha accesso a dim, quindi posso scrivere dim=A, e così assegno ad A.dim il valore di A51 }5253
void Vettore::stampadim() {54 cout << "La dimensione del vettore è: " << dim << endl;55 }5657
void Vettore::leggivet() {58 int i;59 for (i=0; i<dim; i++) {60 cout << "Inserisci il valore dell'iesimo elemento" << endl;61 cin >> V[i];62 }63 }6465
void Vettore::stampavet() {66 int i;67 for (i=0; i<dim; i++) {68 cout << V[i] << endl;69 }70 }7172
void Vettore::raddoppiavet() {73 for(int i=0; i<dim; i++) {74 V[i] = 2*V[i];75 }76 }777879
Costruttore e distruttore
/*In C++ esistono due funzioni particolari: la funzione costruttore e quella distruttore.80 Esse hanno sempre lo stesso nome della classe: se ho fatto una classe vettore, la funzione costruttore si chiamerà 81 appunto "vettore", mentre quella distruttore "~vettore".82 La funzione costruttore non deve mai restituire alcun tipo di argomento (non si mette mai void, double, int... dalla parte del codomio).83 Voglio che la funzione costruttore abbia come effetto quello di scrivere un messaggio a video che avvisa che 84 l'oggetto è stato costruito. Questa funzione viene chiamata in maniera automatica quando l'oggetto viene creato.85 La linea di codice di istanziazione "vettore A" di prima, chiama in maniera automatica la funzione costruttore, 86 e lo farà per ogni oggetto costruito in quella classe.87 Ora creiamo la versione del distruttore. L'unica cosa che cambia è l'aggiunta della ~(tilde).*/888990
//----------------------------------------------------------------------------------------·--------------// d 盦}91 *9293
Allocazione dinamica della memoria
/*Allocazione dinamica della memoria 94 Per elaborare un file, esso va portato nella memoria di lavoro.95 Cosa significa gestire la memoria dinamica del nostro computer? Useremo "malloc" (allocare qualcosa alla memoria), 96 "delete" (cancellare), "new" (fare qualcosa di nuovo) e "free" (liberare qualcosa).97 La prima e l'ultima sono funzioni del linguaggio C; in C, alloco con malloc e cancello con free.98 In C++ non sono funzioni, invece, pertanto non saranno seguite da parentesi tonde; alloco con new, e cancello con delete.99100
La funzione "malloc" alloca la memoria quando ci serve.101 L'allocazione statica si chiama così perché una volta fatta, è staticamente bloccata; essa è la più facile da eseguire,102 ma c'è uno spreco di memoria. Per cambiare la logica, dobbiamo cambiare anche l'area di memoria: in un'area si fanno le -Sopra).103 cose staticamente, nell'altra dinamicamente (Vedi disegno su appunti su iPad).104 Per accedere all'area statica, non c'è necessità di usare i puntatori, contrariamente alla memoria dinamica, dove sono 105 fondamentali. Da questo momento in poi, in un qualsiasi main, se voglio accedere all'area dinamica, devo 106 dichiarare una variabile di tipo puntatore; di conseguenza, devo anche dichiarare una struttura dati, la cui più 107 semplice è la struttura dati, il vettore è quella più semplice.108 Vado a dichiarare una variabile p che conterrà l'indirizzo della variabile puntatore.109 Chiedo a runtime (fase di esecuzione) la dimensione del mio vettore: mentre lo sto eseguendo,110 chiedo all'utente di inserire un numero, e questo numero sarà la dimensione del mio vettore 111 ("Quanto deve essere lungo/grande dim?"").112 Quando viene assegnato un valore, dim in C diventa un'informazione che può essere usata da una funzione,113 la quale, avendo saputo quanto deve essere grande l'area di memoria, la riserva.114 "malloc" deve riservare la memoria tramite sizeof() byte, e di questi interi ne deve memorizzare dim.115 D'ora in poi, posso gestire una funzione vettoriale p[i] per puntare la i-esima componente.116 Se mi accorgo di aver bisogno di altri 100 elementi (quindi dim aumenta), faccio "malloc" e troverà altra area disponibile.117 "free()" deve scegliere il riferimento tra area di memoria statica e dinamica.118 - "free(p);" annulla il valore di p.119 - "delete p;" cancella tutto, ma non è una funzione, motivo per cui non mettiamo le parentesi 120 - "new" necessita di un'informazione che dice di quali variabili stiamo parlando, e quante ne voglio: p = new[int, dim].*/121122123
Esempio di codice
#include <iostream>124 #include <cstdlib> // Necessaria per malloc e free125126 using namespace std;127128
int main() {129 int dim;130 int *p;131132
cout << "Inserisci la dimensione: ";133 cin >> dim;134135
//Libera la memoria alla fine136 free(p);137138
return 0;139 }140141
/*Allocare memoria vuol dire trovare un punto in cui posso inserire le informazioni, significa quindi costruire.142
-
Appunti lezione 3 Sistemi per la riabilitazione e la terapia assistita
-
Appunti lezione 1 Sistemi per la riabilitazione e la terapia assistita
-
Appunti lezione 2 Sistemi per la riabilitazione e la terapia assistita
-
Lezione 5 Sistemi per la riabilitazione e la terapia assistita