Questo sito utilizza cookie per raccogliere dati statistici.
Privacy Policy
# Struct
Una **struct** consente di definire un **nuovo tipo di dato composto**, che può contenere al suo interno una collezione di variabili (chiamate membri, campi o attributi) di tipi differenti. In altre parole, una `struct` permette di raggruppare dati eterogenei, consentendo al programmatore di creare strutture più complesse rispetto ai tipi di dato primitivi come `int`, `float`, o `char`.
Creando un nuovo tipo di dato si sta anche definendo la dimensione della memoria necessaria per ogni istanza di quel tipo di dato. La dimensione totale di una variabile di un tipo creato con lo strumento `struct` è la somma delle dimensioni di tutti i suoi attributi.
## Dimensione del nuovo tipo di dato
Consideriamo una struttura che rappresenta una data, con tre membri: giorno, mese e anno. Ciascuno di questi membri utilizza un tipo di dato specifico che determina la loro dimensione in memoria.
```c
struct Data {
int giorno; // Occupa 4 byte (tipicamente)
int mese; // Occupa 4 byte (tipicamente)
int anno; // Occupa 4 byte (tipicamente)
};
```
In questo caso:
* Il membro *giorno* è di tipo `int`, e un intero (tipicamente) occupa 4 byte di memoria.
* Il membro *mese* è anch'esso un intero e occupa 4 byte.
* Il membro *anno*, di tipo `int`, occupa anch'esso 4 byte.
Quindi, la dimensione totale della struttura *Data* sarà la somma delle dimensioni dei suoi membri:
*Dimensione totale \= 4 byte(giorno) \+ 4 byte(mese) \+ 4 byte(anno) \= 12 byte*
Ogni volta che verrà dichiarata una variabile di tipo *Data*, il compilatore alloca **12 byte** di memoria per quell'istanza.
## Utilizzo
### Operazioni sulle struct
* **Dichiarazione:** è l'operazione nella quale diciamo al compilatore che questo nuovo tipo di dato esiste. Questa operazione va svolta prima dell'effettivo utilizzo della `struct`. In genere questa operazione viene scritta subito dopo i diversi `#include.`
```cpp
struct punto3D; // Dico al compilatore che il simblo Punto3D è un nuovo tipo di dato
```
* **Definizione**: è l'operazione nella quale diciamo al compilatore quali attributi compongono questo nuovo tipo di dato. Questa operazione comprende anche l'operazione di dichiarazione, di conseguenza se definisco una `struct` senza averla prima dichiarata il compilatore svolge l'operazione di dichiarazione implicitamente.!
```cpp
struct Punto3D {
int x; // Coordinata x (intero)
int y; // Coordinata y (intero)
int z; // Coordinata z (intero)
float massa; // Massa (numero in virgola mobile)
};
```
* **Istanziazione:** è l'operazione che permette di creare una variabile del nuovo tipo di dato creato (creazione di una istanza). Questa operazione viene eseguita analogamente alla creazione di variabili di qualunque altro tipo di dato (classica operazione di dichiarazione di una variabile).
```cpp
Punto3D puntoA; // Il compilatore alloca lo spazio per tutti gli attributi
// del tipo di dato Punto3D
// Questo spazio verrè "nominato" puntoA
Punto3D puntoB; // Il compilatore alloca lo spazio per tutti gli attributi
// del tipo di dato Punto3D
// Questo spazio verrè "nominato" puntoB
```
* **Assegnazione**: è l'operazione in cui assegno dei valori agli attributi dell'istanza. L'operazione è molto simile all'operazione di assegnamento in una variabile normale. La differenza sta a sinistra dell'uguale, dove dobbiamo spiegare a quale attributo della variabile vogliamo assegnare il valore presente alla destra dell'uguale.
```cpp
puntoA.x = 5; // i posiziono nella porzione di memoria dell'attributo "x"
// della variabile puntoA e ci assegno il valore 5
puntoA.y = 4;
puntoA.z = 7;
puntoA.massa = 3.14;
```
* **Lettura**: è l'operazione che ci permette di ottenere il valore di un determinato attributo della `struct` per poterlo stampare o utilizzare per eseguire dei calcoli o delle operazioni. Si esegue scrivendo il nome della variabile seguito da un punto e poi il nome dell'attributo del quale si vuole ottenere il valore.
```cpp
puntoB.x = puntoA.x;
```
### Esempio di utilizzo
Immaginiamo di voler rappresentare un **punto nello spazio tridimensionale** con le sue coordinate ***x**, **y**,* e **z** e un attributo che rappresenta la sua **massa**.
In questo esempio, definiremo una `struct` chiamata *Punto3D* che contiene:
* **x**: una coordinata intera, che occupa 4 byte,
* **y**: un'altra coordinata intera, che occupa 4 byte,
* **z**: una terza coordinata intera, che occupa 4 byte,
* **massa**: una variabile in virgola mobile (float), che occupa 4 byte.
```c
#include <iostream>
using namespace std;
struct Punto3D {
int x; // Coordinata x (intero)
int y; // Coordinata y (intero)
int z; // Coordinata z (intero)
float massa; // Massa (numero in virgola mobile)
};
int main() {
// Dichiarazione di una variabile di tipo Punto3D
Punto3D punto;
// Assegnazione dei valori ai membri della struct
punto.x = 5; // Assegna 5 alla coordinata x
punto.y = 10; // Assegna 10 alla coordinata y
punto.z = 15; // Assegna 15 alla coordinata z
punto.massa = 12.5; // Assegna 12.5 alla massa
// Stampa dei valori della variabile 'punto'
cout << "Punto 3D: (" << punto.x << ", ";
cout << punto.y << ", " << punto.z << ")" << endl;
cout << "Massa: " << punto.massa << " kg" << endl;
// Dichiarazione di un'altra variabile di tipo Punto3D
Punto3D secondoPunto;
// Assegnazione dei valori ai membri della struct
secondoPunto.x = 54; // Assegna 54 alla coordinata x
secondoPunto.y = 23; // Assegna 23 alla coordinata y
secondoPunto.z = 5; // Assegna 5 alla coordinata z
secondoPunto.massa = 3.14; // Assegna 3.14 alla massa
return 0;
}
```