ITA - Appunti Cpp 014 - Struct VS Class
September 2024 (707 Words, 4 Minutes)
Le struct
e le classi class
rappresentano due concetti fondamentali per la gestione e l’organizzazione dei dati.
Definizione e Differenze Fondamentali
Struct
Le struct
sono tipicamente utilizzate per raggruppare variabili correlate sotto un unico nome.
Ogni elemento all’interno di una struct è chiamato “membro”.
- Tipicamente più leggere: Le struct sono solitamente più leggere rispetto alle classi, il che le rende più adatte per situazioni in cui le prestazioni e l’uso della memoria sono critici.
- Valore predefinito: Le struct, per impostazione predefinita, vengono passate per valore.
- Meno flessibili: Le struct non supportano ereditarietà o polimorfismo, limitando la loro flessibilità in termini di programmazione orientata agli oggetti.
Classi
Le classi sono il fondamento della programmazione orientata agli oggetti (OOP). Esse permettono di creare oggetti che combinano dati (membri dei dati) e funzioni (metodi) che operano su quei dati.
- Flessibilità e Potenza: Le classi supportano l’ereditarietà e il polimorfismo, consentendo una maggiore flessibilità e riusabilità del codice.
- Passaggio per riferimento: Le classi, per impostazione predefinita, vengono passate per riferimento. Ciò significa che viene passata solo l’indirizzo della classe, non una copia completa dei dati, il che può risparmiare memoria ma richiede attenzione per evitare effetti collaterali non voluti.
- Encapsulamento: Le classi supportano l’incapsulamento, un principio fondamentale dell’OOP che consente di nascondere i dettagli dell’implementazione interna e di esporre solo ciò che è necessario attraverso interfacce pubbliche.
Confronto di Utilizzo
Performance
In termini di performance, le struct sono spesso preferite quando si ha a che fare con piccole quantità di dati che non richiedono un comportamento complesso. Le classi, invece, essendo più estese, possono introdurre un overhead maggiore; tuttavia, la loro capacità di gestire comportamenti complessi e la flessibilità nella progettazione software le rendono la scelta preferita per sistemi più grandi e complessi.
#include <iostream>
#include <chrono>
#include <vector>
struct Test_Struct {
int i;
double d;
char c;
};
class Test_Class {
public:
int i;
double d;
char c;
};
long int sizes_vect[] = {100000, 1000000, 10000000, 100000000};
int main() {
// Creazione di vettori di struct e class
for (int s : sizes_vect)
{
std::cout << "Size " << s << std::endl;
std::vector<Test_Struct> struct_vector(s);
std::vector<Test_Class> class_vector(s);
// Misurazione del tempo per copiare le struct
auto start_struct_copy = std::chrono::high_resolution_clock::now();
std::vector<Test_Struct> struct_copy = struct_vector;
auto end_struct_copy = std::chrono::high_resolution_clock::now();
auto duration_struct_copy = std::chrono::duration_cast<std::chrono::milliseconds>(end_struct_copy - start_struct_copy).count();
std::cout << "Tempo per copiare le struct: " << duration_struct_copy << " ms" << std::endl;
// Misurazione del tempo per copiare le classi
auto start_class_copy = std::chrono::high_resolution_clock::now();
std::vector<Test_Class> class_copy = class_vector;
auto end_class_copy = std::chrono::high_resolution_clock::now();
auto duration_class_copy = std::chrono::duration_cast<std::chrono::milliseconds>(end_class_copy - start_class_copy).count();
std::cout << "Tempo per copiare le classi: " << duration_class_copy << " ms" << std::endl;
}
return 0;
}
Complessità e Manutenibilità
Quando si tratta di gestire la complessità e la manutenibilità del codice, le classi sono di solito superiori. La capacità di utilizzare l’ereditarietà per estendere le funzionalità e il polimorfismo per gestire oggetti diversi tramite un’interfaccia comune permette una migliore organizzazione del codice.
Le struct, essendo più semplici e meno flessibili, possono essere più facili da capire e da utilizzare per piccoli progetti o per rappresentare semplici aggregati di dati, ma diventano meno pratiche man mano che la complessità del progetto aumenta.
Sicurezza del Codice
L’incapsulamento fornito dalle classi permette una maggiore sicurezza del codice, poiché i dettagli interni di una classe possono essere nascosti e protetti dall’accesso esterno non autorizzato. Questo livello di protezione non è disponibile con le struct, che tendono a esporre tutti i loro membri pubblicamente.
Riferimenti
- en.cppreference.com - struct and classes
- stackoverflow.com - what are the differences between struct and class in c
- isocpp.org - struct vs class
- www.geeksforgeeks.org - structure vs class in cpp/
- when should you use a class vs a struct in c
- www.fluentcpp.com - the real difference between struct class/
Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale Theme Moonwalk