Classi contro Struct

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 assegnata la memoria nell'heap e a struct viene assegnata memoria nello stack (nota: questo è errato per C ++, ma forse corretto in quello che l'OP chiama "lingue influenzate")
  2. Le variabili di classe sono private per impostazione predefinita e in struct sono pubbliche

La mia domanda è: il struct è stato in qualche modo abbandonato per Class? Se è così, perché? Oltre alle differenze sopra, un struct può fare tutte le stesse cose che fa una classe. Allora perché abbandonarlo?

    
posta prometheuspk 30.07.2011 - 11:56
fonte

3 risposte

11

Non è affatto abbandonato. Infatti, anche i linguaggi moderni come C # che fanno un uso pesante di class ti offrono ancora struct . Per quanto riguarda quando è utile sceglierne uno rispetto all'altro, ti rimando a questo articolo:

Scelta tra classi e strutture

Citato dall'articolo MSDN:

Consider defining a structure instead of a class if instances of the type are small and commonly short-lived or are commonly embedded in other objects.

Do not define a structure unless the type has all of the following characteristics:

  • It logically represents a single value, similar to primitive types (integer, double, and so on).
  • It has an instance size smaller than 16 bytes.
  • It is immutable.
  • It will not have to be boxed frequently.
    
risposta data 30.07.2011 - 12:04
fonte
17

Ti stai sbagliando per C ++: l'unica differenza significativa tra classe e struct è la differenza di identificatore di accesso predefinita. Struct e class sono sinonimi a tutti gli effetti, credo che struct sia tenuto in ordine di compatibilità con le versioni precedenti di C.

    
risposta data 30.07.2011 - 12:00
fonte
2

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

una struct in d non è altro che uno stack allocato record di dati con alcune funzioni che puoi chiamare su di esso (c'è nessuna opzione per ereditarietà a meno che tu non usi un enum + union setup cioè implementa il polimorfismo te stesso ) che viene passato per valore

una classe è come siamo abituati a: funzioni virtuali, allocazione dell'heap, ereditarietà (singola), passati per ref

    
risposta data 30.07.2011 - 15:05
fonte

Leggi altre domande sui tag