Classe contro struttura


12

In C ++ e in altri linguaggi influenzati esiste un costrutto chiamato Structure ( struct) e un altro chiamato class. Entrambi sono in grado di contenere funzioni e variabili. Alcune differenze sono:

  1. Alla classe viene data memoria nell'heap e structviene data memoria nello stack (nota: questo è sbagliato per C ++, ma forse corretto in ciò che l'OP ha chiamato "linguaggi influenzati")
  2. Le variabili di classe sono private per impostazione predefinita e structsono pubbliche

La mia domanda è: è stato in structqualche modo abbandonato per Class? Se è così, perché? Oltre alle differenze sopra, a structpuò fare tutte le stesse cose che fa una classe. Quindi perché abbandonarlo?


per abbandono intendevo il motivo per cui uno è usato sull'altro.
prometheuspk,

la tua domanda risponde a questo stesso credo.
Umair A.

3
La differenza tra classi e strutture dipende dalla lingua. Alcune lezioni dal C ++ non si applicano realmente al C #.
Giobbe

6
Uhhhh. In C ++ è possibile allocare oggetti nello stack o nell'heap. Dove vuoi.
jojo,

8
Sbagliato, sbagliato, sbagliato. Stack vs. heap non ha nulla a che fare con la differenza.
Aaronaught,

Risposte:


11

Non è affatto abbandonato. In effetti, anche i linguaggi moderni come C # che fanno un uso intensivo di classoffrono ancora struct. Per quanto riguarda quando è utile sceglierne uno sopra l'altro, ti rimando a questo articolo:

Scegliere tra classi e strutture

Citato dall'articolo MSDN:

Prendi in considerazione la definizione di una struttura anziché di una classe se le istanze del tipo sono piccole e comunemente di breve durata o sono comunemente incorporate in altri oggetti.

Non definire una struttura a meno che il tipo non abbia tutte le seguenti caratteristiche:

  • Rappresenta logicamente un singolo valore, simile ai tipi primitivi (intero, doppio e così via).
  • Ha una dimensione dell'istanza inferiore a 16 byte.
  • È immutabile
  • Non dovrà essere inscatolato frequentemente.

4
Questa risposta è davvero sbagliata poiché il significato di .Net / C # struct / class è diverso da quello di C ++: usano lo stesso nome ma hanno una semantica diversa a seconda della lingua !!! In C ++ non c'è quasi alcuna differenza tra struct e class e la domanda è totalmente sbagliata sul primo punto, che è proprio in c # e D ma non in c ++. Quindi il link a questo articolo, che riguarda .Net, è davvero sbagliato. Non è C ++!
Klaim,

Anche tecnicamente @Klaim non è giusto per C # (le strutture possono essere nell'heap) L'importante distinzione in C # è tra semantica di valore e semantica di riferimento, una distinzione di cui C ++ non ha bisogno in quanto può avere valori o riferimenti per qualsiasi cosa
jk.

17

Ti sbagli su C ++: l'unica differenza significativa tra class e struct è la differenza dell'identificatore di accesso predefinito. Struct e class sono a tutti gli effetti sinonimi, credo che struct sia conservata per compatibilità con le versioni precedenti di C.


7
Non solo. Struct è una buona scelta quando si desidera semplicemente scaricare un mucchio di dati in un oggetto e non aggiungere alcun comportamento ad esso.
quant_dev,

2
@quant: questa è una terribile ragione per usare una struttura. Spero davvero che il commento sia stato ironico.
Aaronaught,

1
@Aaronaught Why? La mia opinione sull'uso di struct è abbastanza standard, vedere questa risposta, per esempio: stackoverflow.com/questions/54585/...
quant_dev

1
@Aaronaught Come si restituiscono più valori allora? Ad esempio, un modello di elaborazione restituisce il prezzo pulito, il prezzo sporco e la somma dei pagamenti maturati.
quant_dev

1
@quant_dev - puoi decidere di associare un meta-significato a una struttura per i tuoi scopi (e per gli ex programmatori C uno che in realtà ha molto senso), ma ciò non cambia il fatto che l'unica differenza tra la struttura e parole chiave di classe in C ++ è l'accesso predefinito.
Joris Timmermans,

2

il linguaggio D ha creato una maggiore distinzione tra classe e struttura

uno struct in d non è altro che un set di dati allocato in stack con alcune funzioni che è possibile richiamare su di esso (non esiste alcuna opzione per l'ereditarietà a meno che non si usi una configurazione enum + union cioè implementando il polimorfismo da soli) che viene passato per valore

una classe è come siamo abituati a: funzioni virtuali, allocazione di heap, ereditarietà (singola), passata da ref

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.