Quali sono le differenze tra struct e class in C ++?

Questa domanda è stata già posta nel contesto di C # /. Net .

Ora mi piacerebbe imparare le differenze tra una struct e una class in C ++. Si prega di discutere le differenze tecniche, nonché i motivi per la scelta di uno o l’altro in progettazione OO.

Inizierò con un’evidente differenza:

  • Se non si specifica public: or private: membri di una struct sono pubblici per impostazione predefinita; i membri di una class sono privati ​​per impostazione predefinita.

Sono sicuro che ci sono altre differenze da trovare negli angoli oscuri della specifica C ++.

Dimentichi la difficile seconda differenza tra classi e strutture.

Lo standard (§11.2.2 in C ++ 98 a C ++ 11):

In assenza di un identificatore di accesso per una class base, si assume il pubblico quando la class derivata viene dichiarata struct e viene assunto privato quando la class viene dichiarata class .

E solo per completezza, la differenza più nota tra class e struttura è definita in (11.2):

I membri di una class definita con la class parola chiave sono privati per impostazione predefinita. I membri di una class definita con le parole chiave struct o union sono pubblici per impostazione predefinita.

Ulteriore differenza: la class parola chiave può essere utilizzata per dichiarare i parametri del modello, mentre la parola chiave struct non può essere utilizzata in questo modo.

Citando le domande frequenti su C ++ ,

[7.8] Qual è la differenza tra le parole chiave struct e class?

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

La struttura e la class sono altrimenti equivalenti dal punto di vista funzionale.

OK, abbastanza di quel chiacchiericcio pulito e techno. Emotivamente, la maggior parte degli sviluppatori fa una forte distinzione tra una class e una struttura. Una struttura si sente semplicemente come una pila aperta di bit con pochissimo in termini di incapsulamento o funzionalità. Una class 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 class che ha pochissimi metodi e ha dati pubblici (cose del genere esistono in sistemi ben progettati!), Ma altrimenti dovresti probabilmente usare la class parola chiave.

Vale la pena ricordare le origini di C ++ e la compatibilità con C.

C ha delle strutture, non ha alcun concetto di incapsulamento, quindi tutto è pubblico.

Essere pubblico di default è generalmente considerato una ctriggers idea quando si prende un approccio orientato agli oggetti, quindi nel creare una forma di C che sia nativamente favorevole a OOP (si può fare OO in C, ma non vi aiuterà) che era il idea in C ++ (originariamente “C With Classes”), ha senso rendere i membri privati ​​di default.

D’altra parte, se Stroustrup avesse cambiato la semantica di struct modo che i suoi membri fossero privati ​​di default, avrebbe rotto la compatibilità (non è più così spesso come gli standard divergevano, ma tutti i programmi C validi erano anche programmi C ++ validi , che ha avuto un grande effetto nel dare un punto d’appoggio al C ++).

Quindi una nuova parola chiave, class stata introdotta per essere esattamente come una struttura, ma privata di default.

Se C ++ fosse venuto da zero, senza cronologia, probabilmente avrebbe una sola parola chiave del genere. Probabilmente anche non avrebbe fatto l’impatto che ha fatto.

In generale, le persone tendono a usare struct quando fanno qualcosa di simile a come le strutture sono usate in C; membri pubblici, nessun costruttore (purché non sia in un sindacato, puoi avere costruttori nelle strutture, proprio come con le classi, ma le persone tendono a non farlo), nessun metodo virtuale, ecc. Poiché le lingue sono tanto comunicative con le persone che leggono il codice per istruire le macchine (oppure ci limiteremmo ad assemblare e agli opcode di VM grezzi) è una buona idea attenersi a questo.

I membri della class sono privati ​​per impostazione predefinita. I membri di Struct sono pubblici per impostazione predefinita. Oltre a ciò non ci sono altre differenze. Vedi anche questa domanda .

Secondo Stroustrup nel linguaggio di programmazione C ++ :

Quale stile usi dipende dalle circostanze e dal gusto. Di solito preferisco usare struct per le classi che hanno tutti i dati pubblici. Penso a classi come “tipi non proprio adeguati, solo strutture dati”.

Funzionalmente, non c’è altra differenza rispetto al pubblico / privato

STRUCT è un tipo di tipo di dati astratto che divide un determinato blocco di memoria in base alle specifiche della struttura. Le strutture sono particolarmente utili nella serializzazione / deserializzazione dei file poiché la struttura può essere spesso scritta nel file letteralmente. (cioè Ottieni un puntatore alla struct, usa la macro SIZE per calcolare il numero di byte da copiare, quindi sposta i dati dentro o fuori la struct.)

Le classi sono un diverso tipo di tipo di dati astratti che cercano di garantire l’occultamento delle informazioni. Internamente, ci possono essere una varietà di macchinazioni, metodi, variabili temporali, variabili di stato. ecc. che sono tutti usati per presentare un’API coerente a qualsiasi codice che desideri utilizzare la class.

In effetti, le strutture riguardano i dati, le classi riguardano il codice.

Tuttavia, è necessario comprendere che si tratta di semplici astrazioni. È perfettamente ansible creare strutture che somigliano molto a classi e classi che assomigliano molto alle strutture. In effetti, i primi compilatori C ++ erano solo pre-compilatori che traducono il codice C ++ in C. Quindi queste astrazioni sono un vantaggio per il pensiero logico, non necessariamente una risorsa per il computer stesso.

Oltre al fatto che ognuno è un diverso tipo di astrazione, le Classi forniscono soluzioni al puzzle di denominazione del codice C. Dato che non è ansible avere più di una funzione esposta con lo stesso nome, gli sviluppatori hanno seguito uno schema di _ (). es. mathlibextreme_max (). Raggruppando le API in classi, funzioni simili (qui li chiamiamo “metodi”) possono essere raggruppate e protette dalla denominazione dei metodi in altre classi. Ciò consente al programmatore di organizzare meglio il suo codice e aumentare il riutilizzo del codice. In teoria, almeno.

L’unica altra differenza è l’ereditarietà predefinita di classi e strutture, che, ovviamente, sono private e pubbliche rispettivamente.

1) I membri di una class sono privati ​​per impostazione predefinita e i membri di struct sono pubblici per impostazione predefinita.

Ad esempio, il programma 1 non riesce nella compilazione e il programma 2 funziona correttamente.

 // Program 1 #include  class Test { int x; // x is private }; int main() { Test t; tx = 20; // compiler error because x is private getchar(); return 0; } Run on IDE // Program 2 #include  struct Test { int x; // x is public }; int main() { Test t; tx = 20; // works fine because x is public getchar(); return 0; } 

2) Quando si ricava una struct da una class / struct, l’identificatore di accesso predefinito per una class / struct di base è pubblico. E quando si ottiene una class, l’identificatore di accesso predefinito è privato.

Ad esempio, il programma 3 non riesce nella compilazione e il programma 4 funziona correttamente.

 // Program 3 #include  class Base { public: int x; }; class Derived : Base { }; // is equilalent to class Derived : private Base {} int main() { Derived d; dx = 20; // compiler error becuase inheritance is private getchar(); return 0; } Run on IDE // Program 4 #include  class Base { public: int x; }; struct Derived : Base { }; // is equilalent to struct Derived : public Base {} int main() { Derived d; dx = 20; // works fine becuase inheritance is public getchar(); return 0; } 

Non nelle specifiche, no. La principale differenza è nelle aspettative dei programmatori quando leggono il tuo codice in 2 anni. le strutture sono spesso considerate POD. Le strutture vengono anche utilizzate nella metaprogrammazione del modello quando si definisce un tipo per scopi diversi dalla definizione di oggetti.

Un’altra cosa da notare, se hai aggiornato un’app legacy con le strutture in cui utilizzare le classi potresti avere il seguente problema:

Il vecchio codice ha le strutture, il codice è stato ripulito e questi sono stati modificati in classi. Una o due funzioni virtuali sono state quindi aggiunte alla nuova class aggiornata.

Quando le funzioni virtuali sono nelle classi, internamente il compilatore aggiungerà un puntatore aggiuntivo ai dati della class per puntare alle funzioni.

In che modo questo potrebbe infrangere il vecchio codice legacy è se nel vecchio codice da qualche parte la struttura è stata cancellata usando memfill per cancellare tutto a zero, questo potrebbe calpestare anche i dati del puntatore extra.

  1. I membri di una struttura sono pubblici per impostazione predefinita, i membri della class sono privati ​​per impostazione predefinita.
  2. L’ereditarietà predefinita per Struttura da un’altra struttura o class è pubblica. L’ereditarietà predefinita per la class da un’altra struttura o class è privata.
 class A{ public: int i; }; class A2:A{ }; struct A3:A{ }; struct abc{ int i; }; struct abc2:abc{ }; class abc3:abc{ }; int _tmain(int argc, _TCHAR* argv[]) { abc2 objabc; objabc.i = 10; A3 ob; ob.i = 10; //A2 obja; //privately inherited //obja.i = 10; //abc3 obss; //obss.i = 10; } 

Questo è su VS2005.

Un’altra differenza principale è quando si tratta di modelli. Per quanto ne so, puoi usare una class quando definisci un modello ma NON una struttura.

 template // OK template // ERROR, struct not allowed here 
  • . Nelle classi tutti i membri per impostazione predefinita sono privati ​​ma i membri della struttura sono pubblici per impostazione predefinita.

    1. Non esiste un termine come costruttore e distruttore per le strutture, ma per il compilatore di classi crea un valore predefinito se non lo si fornisce.

    2. La dimensione della struttura vuota è 0 byte come dimensione della class vuota è 1 byte Il tipo di accesso predefinito della struttura è pubblico. Generalmente si dovrebbe usare una struct per raggruppare i dati.

    Il tipo di accesso predefinito della class è privato e la modalità predefinita per l’ereditarietà è privata. Una class deve essere utilizzata per raggruppare dati e metodi che operano su tali dati.

    In breve, la convenzione consiste nell’utilizzare struct quando lo scopo è raggruppare i dati e utilizzare le classi quando si richiede l’astrazione dei dati e, forse, l’ereditarietà.

    In C ++, le strutture e le classi vengono passate per valore, a meno che non vengano de-referenziati in modo esplicito. In altre lingue le classi e le strutture possono avere una semantica distinta, ad es. oggetti (istanze di classi) possono essere passati per riferimento e le strutture possono essere passati per valore. Nota: ci sono commenti associati a questa domanda. Vedi la pagina di discussione per aggiungere alla conversazione.

Ecco una buona spiegazione: http://carcino.gen.nz/tech/cpp/struct_vs_class.php

Quindi, ancora una volta: in C ++, una struct è identica a una class tranne che i membri di una struct hanno visibilità pubblica per impostazione predefinita, ma i membri di una class hanno visibilità privata per impostazione predefinita.

È solo una convenzione. Le strutture possono essere create per contenere dati semplici, ma in seguito possono evolvere il tempo con l’aggiunta di funzioni membro e costruttori. D’altra parte è raro vedere qualcosa di diverso dal pubblico: accesso in una struttura.

ISO IEC 14882-2003

9 lezioni

§3

Una struttura è una class definita con la struct chiave di class ; i suoi membri e le classi di base (clausola 10) sono di dominio pubblico (clausola 11).

Le altre risposte hanno menzionato le impostazioni predefinite private / pubbliche, (ma si noti che una struct è una class è una struct, non sono due elementi diversi, solo due modi per definire lo stesso elemento).

Ciò che potrebbe essere interessante notare (in particolare dal momento che il richiedente probabilmente utilizza MSVC ++ poiché menziona C ++ “non gestito”) è che Visual C ++ si lamenta in determinate circostanze se una class viene dichiarata con class e quindi definita con struct (o forse l’altro modo rotondo), anche se lo standard dice che è perfettamente legale.

Mentre è implicito in altre risposte, non è esplicitamente menzionato – che le strutture sono compatibili con C, a seconda dell’utilizzo; le classi non lo sono.

Questo significa che se stai scrivendo un’intestazione che vuoi essere compatibile con C, non hai altra scelta che struct (che nel mondo C non può avere funzioni, ma può avere dei puntatori di funzione).

La differenza tra le parole chiave struct e class in C ++ è che, quando non esiste un identificatore specifico su un particolare tipo di dati compositi, per default struct or union è le parole chiave pubbliche che considerano semplicemente l’occultamento dei dati ma class è la parola chiave privata che considera l’occultamento del programma codici o dati. Sempre alcuni programmatori usano struct per dati e classi per il codice. Per maggiori informazioni contattare altre fonti.

Di tutti questi fattori, si può concludere che il concetto di Classe è altamente adatto a rappresentare oggetti del mondo reale piuttosto che “Strutture”. In senso stretto perché i concetti OOP usati in class sono molto pratici nella spiegazione degli scenari del mondo reale, quindi più facili da unire alla realtà. Per un esempio, l’ereditarietà predefinita è pubblica per le strutture ma se applichiamo questa regola per il mondo reale, è ridicola. Ma in un’eredità predefinita di class è privata, che è più realistico.

Ad ogni modo, ciò che ho bisogno di giustificare è Class è un concetto molto più ampio, applicabile al mondo reale, mentre Structure è un concetto primitivo con una scarsa organizzazione interna (la struttura Eventhough segue i concetti OOP, hanno un significato scarso)

La class è significativa solo nel contesto dell’ingegneria del software. Nel contesto delle strutture dati e degli algoritmi, la class e la struttura non sono così diverse. Non esiste alcuna regola che limiti il ​​riferimento al membro della class.

Quando si sviluppa un progetto di grandi dimensioni con tonnellate di persone senza class, si può finalmente ottenere un complicato codice accoppiato perché tutti usano le funzioni e i dati che desiderano. la class fornisce i controlli di authorization e inerente per migliorare i codici di disaccoppiamento e riutilizzo.

Se leggi alcuni principi di ingegneria del software, scoprirai che la maggior parte degli standard non può essere implementata facilmente senza class. ad esempio: http://en.wikipedia.org/wiki/SOLID_%28object-oriented_design%29

BTW, quando una struct alloca un crunch di memoria e include diverse variabili, le variabili di tipo value indicano che i valori sono racchiusi in cui viene allocata la struct. Al contrario, i valori della variabile di tipo reference sono esterni e di riferimento da un puntatore che è anche incorporato in dove viene allocata la struct.

Si potrebbe considerare questo per le linee guida su quando andare per struct o class, https://msdn.microsoft.com/en-us/library/ms229017%28v=vs.110%29.aspx .

√ CONSIDER definire una struct al posto di una class se le istanze del tipo sono piccole e comunemente di breve durata o sono comunemente incorporate in altri oggetti.

X EVITARE la definizione di una struttura a meno che il tipo non abbia tutte le seguenti caratteristiche:

Rappresenta logicamente un singolo valore, simile ai tipi primitivi (int, double, ecc.).

Ha una dimensione dell’istanza inferiore a 16 byte.

È immutabile.

Non dovrà essere incassato frequentemente.

Ho trovato un’altra differenza. se non si definisce un costruttore in una class, il compilatore ne definirà uno. ma in una struttura se non si definisce un costruttore, il compilatore non definisce anche un costruttore. quindi in alcuni casi non abbiamo davvero bisogno di un costruttore, struct è una scelta migliore (tip di prestazioni). e mi dispiace per il mio pessimo inglese.

La principale differenza tra la parola chiave structure e class in oops è che, nessuna dichiarazione di membro pubblico e privato presente nella struttura. E la funzione membro membro e membro può essere definita pubblica, privata e protetta.

Sto vedendo un altro diverso tra le strutture e le classi che hanno a che fare con l’inizializzazione di default.

 struct Foo { int a; }; class Bar { int a; }; class Tester { Foo m_Foo = Foo(); Bar m_Bar = Bar(); public: Tester() {} }; int main() { auto myTester = Tester(); } 

Esegui quel codice ed esamina myTester. Scoprirai che per m_Foo, la struct, m_Foo.a è stata inizializzata a 0, ma per m_Bar, la class, m_Bar.a non è inizializzata. Quindi sembra che ci sia una differenza in ciò che il costruttore predefinito fa per struct vs. class. Sto vedendo questo con Visual Studio.

La principale differenza tra struct e class è che in struct è ansible dichiarare solo variabili di dati di tipi di dati diversi mentre in class è ansible dichiarare variabili di dati, funzioni membro e quindi è ansible manipolare le variabili di dati attraverso le funzioni.

-> un’altra cosa utile che trovo nella class vs struct è che mentre si implementano i file in un programma se si desidera eseguire alcune operazioni di una struttura più e più volte su ogni nuova serie di operazioni, è necessario creare una funzione separata ed è necessario passare l’object di struct dopo averlo letto dal file in modo da effettuare alcune operazioni su di esso. mentre in class se fai una funzione che fa alcune operazioni sui dati necessari ogni volta … è facile che tu debba leggere l’object dal file e chiamare la funzione ..

Ma dipende dal programmatore in che modo lui / lei trova adatto … secondo me preferisco la class ogni volta solo perché supporta le OOP e questo è il motivo per cui è implementato in quasi tutte le lingue ed è la meravigliosa funzionalità di tutti i programmi temporali; )

E sì, la differenza più indimenticabile che ho dimenticato di menzionare è che la class supporta l’occultamento dei dati e supporta anche le operazioni che vengono eseguite sui tipi di dati integrati mentre struct non lo fa!

Le classi sono tipi di riferimento e le strutture sono tipi di valori.
Quando dico che le classi sono tipi di riferimento,
fondamentalmente conterranno l’indirizzo di una variabile di istanza.

Per esempio:

 Class MyClass { Public Int DataMember; //By default, accessibility of class data members //will be private. So I am making it as Public which //can be accessed outside of the class. } 

Nel metodo principale,
Posso creare un’istanza di questa class utilizzando un nuovo operatore che alloca memoria per questa class
e memorizza l’indirizzo di base della variabile di tipo MyClass (_myClassObject2).

 Static Public void Main (string[] arg) { MyClass _myClassObject1 = new MyClass(); _myClassObject1.DataMember = 10; MyClass _myClassObject2 = _myClassObject1; _myClassObject2.DataMember=20; } 

Nel programma precedente, MyClass _myClassObject2 = _myClassObject1; l’istruzione indica che entrambe le variabili di tipo MyClass

  1. myClassObject1
  2. myClassObject2

e punterà alla stessa posizione di memoria.
Assegna fondamentalmente la stessa posizione di memoria in un’altra variabile dello stesso tipo.

Quindi se qualche cambiamento che facciamo in uno qualsiasi degli oggetti digita MyClass avrà un effetto su un altro
poiché entrambi puntano alla stessa posizione di memoria.

“_myClassObject1.DataMember = 10;” a questa linea entrambi i membri dei dati dell’object conterranno il valore di 10.
“_myClassObject2.DataMember = 20;” a questa linea il membro dei dati dell’object conterrà il valore di 20.
Alla fine, stiamo accedendo ai datamembers di un object attraverso i puntatori.

A differenza delle classi, le strutture sono tipi di valore. Per esempio:

 Structure MyStructure { Public Int DataMember; //By default, accessibility of Structure data //members will be private. So I am making it as //Public which can be accessed out side of the structure. } Static Public void Main (string[] arg) { MyStructure _myStructObject1 = new MyStructure(); _myStructObject1.DataMember = 10; MyStructure _myStructObject2 = _myStructObject1; _myStructObject2.DataMember = 20; } 

Nel programma sopra,
istanziare l’object di tipo MyStructure usando il nuovo operatore e
memorizzando l’indirizzo nella variabile _myStructObject di tipo MyStructure e
assegnare il valore 10 al membro dati della struttura utilizzando “_myStructObject1.DataMember = 10”.

Nella riga successiva,
Sto dichiarando un’altra variabile _myStructObject2 di tipo MyStructure e assegnando _myStructObject1 a quello.
Qui il compilatore .NET C # crea un’altra copia dell’object _myStructureObject1 e
assegna quella posizione di memoria nella variabile MyStructure _myStructObject2.

Quindi qualsiasi modifica apportata su _myStructObject1 non avrà mai un effetto su un’altra variabile _myStructObject2 di tipo MyStructrue.
Ecco perché stiamo dicendo che le strutture sono tipi di valore.

Quindi la class Base immediata per la class è Object e la class Base immediata per Structure è ValueType che eredita da Object.
Le classi supporteranno un’ereditarietà mentre le strutture no.

Come lo stiamo dicendo?
E qual è la ragione dietro a questo?
La risposta è Classi.

Può essere astratto, sigillato, statico e parziale e non può essere privato, protetto e protetto all’interno.

There are 3 basic difference between structure and class

1St- memory are reserved for structure in stack memory (which is near to programming language )whether for class in stack memory are reserved for only reffrence and actual memory are reserved in heap memory.

2Nd – By default structure treat as a public whether class treat as a private .

3Rd- can’t re -use code in structure but in class we can re-use same code in many time called inhertence