2013-07-29 7 views
6

Utilizzando una struct possiamo ottenere tutta la funzionalità di un class: costruttori (che può essere modificato/sovraccarico), distruttori (che può essere modificato/overload), operatore sovraccarico, metodi di istanza, metodi statici, public/private/protected campi/metodi.Perché abbiamo bisogno di un `class` in C++, quando un` struct` può essere usato per ottenere lo stesso?

Perché abbiamo bisogno di class quindi?

Nota: non desidero rispondere affermando che in struct, i campi/metodi sono public per impostazione predefinita.

+0

Direi che è per ragioni "storiche" di compatibilità con [tag: c]. –

+0

È possibile eseguire l'incapsulamento dei dati, nascondendo i dati con le strutture –

+0

Getter (accessors), setter (mutator) hanno un significato nelle OOP che possiamo ottenere in classi e non nelle strutture –

risposta

8

Non hai necessario classi, la lingua ti offre solo un'altra opzione tra cui scegliere. Tecnicamente, hai ragione, puoi ottenere tutto ciò che un class può fare con un struct.

Oltre il livello di accesso di default, c'è anche il significato maggior parte dei programmatori associano con i due - struct generalmente significa un leggero, tipicamente POD, tipo di dati, con poca o nessuna funzionalità. A class viene in genere associato a qualcosa di più grande.

+1

Potrebbe anche valere la pena ricordare che lo stesso standard non distingue tra i due nel suo testo. Cioè, una "classe" può essere definita usando la parola chiave 'class' o la parola chiave' struct'. – Angew

+0

@Angew che sarebbe un "tipo di classe", no? –

+0

"con qualcosa di più grande". Non sarebbe "che include funzionalità"? So che non fa la differenza, proprio come l'ho vissuto. POD vs Type con funzionalità. – JBL

0

Non c'è alcuna differenza tra C++ struct e C++ class, è possibile eseguire quasi tutte le funzioni con struct come si può fare con la classe, ma struct è una parola chiave C che gradualmente è stata modificata/evoluta in C++ e denominata come classe . A siamo in C++, è meglio usare la classe piuttosto che la struct.

Prendete un esempio, se avete fatto qualche codifica in C++ e una persona che lavora in Java è arrivata dopo 2 mesi per rivedere il vostro codice, quale troverà comodo per capire un codice con "struct" o un codice con "classe"?

+1

Cosa si può fare con un 'class' che non si può fare con una' struct'? – jamesdlin

+0

Tutto ciò che può essere fatto con una struct C++ può essere fatto con la classe C++, ma personalmente ritengo che la classe abbia un aspetto migliore di struct in C++. Altrimenti Stroutstrup non avrebbe introdotto la parola chiave a tutti .. Cosa ne pensi? – Saby

+1

Ma hai detto "puoi eseguire quasi tutte le funzioni ...". Com'è "quasi"? – jamesdlin

1

Per farla breve, lo class non era affatto necessario. Cambia le impostazioni predefinite a quelle che sono probabilmente più sicure e più applicabili alla programmazione OO, ma è possibile utilizzare uno struct (come definito da C++) per qualsiasi posto che si utilizza attualmente un class (se si desidera ottenere carino e meta su di esso, è possibile chiamare struct una classe base di class che soddisfi l'LSP).

Allo stesso tempo, incomprensione di struct in C++ è dilagante, e class si adatta al concetto previsto abbastanza meglio che è spesso molto più facile da spiegare. I nuovi utenti sembrano spesso trovarlo almeno marginalmente più comprensibile - un obiettivo ragionevole in sé.

1

class è semplicemente il nome comunemente accettato in OO per un tipo utilizzato per creare istanze di oggetti. Quando si introduce il paradigma OO in C++, è stato ritenuto meno sorprendente utilizzare class anziché struct.

struct era tenuto per massimizzare la compatibilità all'indietro con C.

utilizzo di oggi dei due è in linea con questo: struct è più comunemente usato per i tipi di POD in stile C, mentre class viene utilizzato per il concetto OO di classi.

3

Come Tal Pressman ha risposto a When should you use a class vs a struct in C++?:

Dalla FAQ C++:

I membri ei classi base di una struct sono pubblici per impostazione predefinita, mentre in classe, stabilizzano a privati. Nota: dovresti rendere le tue classi base esplicitamente pubbliche, private o protette, piuttosto che fare affidamento sui valori predefiniti.

struttura e classe sono altrimenti funzionalmente equivalenti.

OK, abbastanza di quel chiacchiericcio pulito e cigolante. Emotivamente, la maggior parte degli sviluppatori fa una forte distinzione tra una classe e una struttura. Una struttura si sente semplicemente come una pila aperta di bit con pochissimo in termini di incapsulamento o funzionalità. Una classe si sente come un membro vivo e responsabile della società con servizi intelligenti, una forte barriera di incapsulamento e un'interfaccia ben definita. Poiché questa è la connotazione che la maggior parte delle persone già possiede, dovresti probabilmente usare la parola chiave struct se hai una classe che ha pochissimi metodi e ha dati pubblici (cose del genere esistono in sistemi ben progettati!), Ma altrimenti dovresti probabilmente usare la classe parola chiave.

http://www.parashift.com/c++-faq-lite/classes-and-objects.html#faq-7.8

Penso che un'aggiunta a questo motivo potrebbe essere che C aveva già le strutture. Quando Bjarne Stroustrup ha progettato C++, voleva aggiungere classi con tutte le funzionalità elencate nella domanda originale, funzionalità che non erano presenti in C. Quando implementava quelle funzionalità, probabilmente si rese conto che non aveva senso fare due implementazioni separate per struct e class (tranne la visibilità predefinita pubblico/privata).

TL/DR: in C++ le strutture/classi descrivono l'intento del programmatore di disporre di POD o di astrazioni più complesse e l'introduzione della parola chiave della classe è probabilmente qui per motivi storici (aggiungere una parola chiave aggiuntiva per creare featurefull classi, quindi eseguire il backport di quelle funzioni nella parola chiave struct perché è più pragmatico da implementare).

Problemi correlati