Quando dovresti usare una classe contro uno struct in C ++?


951

In quali scenari è meglio usare a structvs a classin C ++?


48
Questo non è applicabile solo al C ++, ma a qualsiasi linguaggio che fornisca sia strutture che classi.
Jason Bunting,

3
Non sono ancora d'accordo - mi rivolgo a questa domanda semanticamente. Forse ci sono alcune differenze tecniche, ma semanticamente non lo sono. Le strutture sono davvero utili per la creazione di tipi di valore, le classi no.
Jason Bunting,

4
Credo che non ci siano ragioni serie per usare le strutture in C ++. Per me le strutture sono un'altra "caratteristica" ridondante di C ++ che esiste solo per compatibilità con C, come i typedef. Questi non esisterebbero se C ++ inizialmente non fosse trattato come un'estensione a C, e fosse progettato da zero, come Java. In generale, trovo che molte delle cose più strane su C ++ abbiano a che fare con la compatibilità C.
Kostas,

5
Struct: per POD (semplici vecchi dati) e l'accessibilità di tutti i membri è pubblica. Classe: quando hai bisogno di una migliore incapsulamento e hai bisogno di funzioni membro per lavorare con lo stato della classe.
Navaneeth KN,

4
Questo è vero solo per convenzione. Non vi è alcuna differenza, a parte l'incapsulamento predefinito.
Dave Hillier,

Risposte:


806

Le differenze tra a classe a structin C ++ sono che le strutture hanno publicmembri predefiniti e le basi e le classi hanno privatemembri e basi predefiniti . Entrambe le classi e le strutture possono avere una miscela di public, protectede privatemembri, possono utilizzare l'ereditarietà e possono avere funzioni membro.

Consiglierei di usare le strutture come strutture di dati semplici e vecchie senza alcuna caratteristica di classe e di usare le classi come strutture di dati aggregati con privatedati e funzioni membro.


100
Una struttura senza modificatori o metodi è chiamata POD struct, che esiste come interfaccia retrocompatibile con le librerie C poiché è (presumibilmente) garantito che sia strutturato come se fosse una C-strutt. A parte questa eccezione, però, l'unica differenza è quella dichiarata.
workmad3,

26
@ workmad3: il nome è fuorviante, ma 9/4 (C ++ 03) dice: "Una struttura POD è una classe aggregata che non ha membri di dati non statici di tipo non-POD-struct, non-POD-union (o array di tali tipi) o riferimenti e non ha un operatore di assegnazione di copie definito dall'utente e nessun distruttore definito dall'utente. " Non ci sono restrizioni sull'uso della chiave di classe "struct" e nessuna limitazione sull'uso di "public" (vedere 8.5.1 / 1 per i requisiti aggregati). Questa non è una differenza tra "struct" e "class".

5
Il tuo uso di "aggregato" potrebbe essere frainteso, data la definizione dello standard. :)

3
Secondo il libro "Principi e pratica" di Stroustrup: "Le strutture dovrebbero essere utilizzate principalmente dove i membri possono assumere qualsiasi valore" (ovvero dove non è possibile definire alcun invariante di classe significativo)
antibus

6
Ovviamente puoi usare le classi quando ti interfaccia con C. Non c'è differenza tra classi e strutture. Le strutture sono classi; solo l'accesso predefinito è passato da privato a pubblico.
Sebastian Mach,

230

Come tutti gli altri notano, in realtà ci sono solo due differenze linguistiche reali:

  • structvalori predefiniti per l'accesso pubblico e classvalori predefiniti per l'accesso privato.
  • Quando si eredita, l' structimpostazione predefinita è l' publicereditarietà e l' classimpostazione predefinita è l' privateereditarietà. (Ironia della sorte, come per tante altre cose in C ++, l'impostazione predefinita è al contrario: l' publicereditarietà è di gran lunga la scelta più comune, ma le persone raramente dichiarano structdi risparmiare solo digitando la " public" parola chiave.

Ma la vera differenza nella pratica è tra un class/ structche dichiara un costruttore / distruttore e uno che non lo fa. Esistono alcune garanzie per un tipo POD "dati semplici", che non si applicano più una volta acquisita la costruzione della classe. Per mantenere chiara questa distinzione, molte persone usano deliberatamente structs solo per i tipi POD e, se stanno per aggiungere metodi, usano classes. In caso contrario, la differenza tra i due frammenti non ha senso:

class X
{
  public:

  // ...
};

struct X
{
  // ...
};

(Per inciso, ecco un thread con alcune buone spiegazioni su cosa significhi effettivamente "tipo POD": cosa sono i tipi POD in C ++? )


Un bell'esempio per quanto riguarda le differenze ereditarie: qui .
Liran Orevi,

8
Se si utilizza structo classnon ha alcuna influenza sul fatto che il proprio oggetto sia POD o se si debba definire un costruttore / distruttore di copie. Anche le funzioni membro non influiscono su qualcosa che è POD. Mentre rileggo quello che hai scritto, vedo che non stai suggerendo diversamente, ma l'attuale formulazione è confusa
David Stone,

1
@DavidStone Fondamentalmente, le strutture POD dovrebbero essere garantite per essere retrocompatibili con il codice C, e quindi sostanzialmente dovrebbero essere progettate come strutture in stile C.
Justin Time - Ripristina Monica il

3
La parte "vera differenza" di questa risposta è totalmente sbagliata.
juanchopanza,

178

Ci sono molte idee sbagliate nelle risposte esistenti.

Entrambi classe structdichiarano una classe.

Sì, potrebbe essere necessario riorganizzare le parole chiave modificando l'accesso all'interno della definizione della classe, a seconda della parola chiave utilizzata per dichiarare la classe.

Ma, al di là della sintassi, l' unica ragione per scegliere l'una rispetto all'altra è la convenzione / stile / preferenza.

Ad alcune persone piace attenersi alla structparola chiave per le classi senza funzioni membro, perché la definizione risultante "sembra" una struttura semplice da C.

Allo stesso modo, ad alcune persone piace usare la classparola chiave per le classi con funzioni e privatedati dei membri , perché dice "classe" su di essa e quindi sembra esempi dal loro libro preferito sulla programmazione orientata agli oggetti.

La realtà è che questo dipende completamente da te e dal tuo team, e non farà letteralmente alcuna differenza per il tuo programma.

Le seguenti due classi sono assolutamente equivalenti in ogni modo tranne il loro nome:

struct Foo
{
   int x;
};

class Bar
{
public:
   int x;
};

Puoi anche cambiare le parole chiave durante la redeclaration:

class Foo;
struct Bar;

(anche se questo rompe le build di Visual Studio a causa della non conformità, in modo che il compilatore emetterà un avviso quando lo fai.)

e le seguenti espressioni valutano entrambe come vere:

std::is_class<Foo>::value
std::is_class<Bar>::value

Si noti, tuttavia, che non è possibile cambiare le parole chiave durante la ridefinizione ; questo solo perché (secondo la regola di una definizione) le definizioni di classe duplicate tra le unità di traduzione devono "consistere nella stessa sequenza di token" . Questo significa che non puoi nemmeno scambiarti const int member;con int const member;, e non ha nulla a che fare con la semantica di classo struct.


16
Questa è stata molto istruttiva e onestamente la mia risposta preferita. Tutti gli altri li trattano come entità separate, quando sotto il cofano sono uguali. Mi chiedo se una definizione di struttura nell'ambiente Arduino sia considerata una classe cpp, visto che è stata compilata usando g ++.
Benjamin,

4
@Ben Certo che lo è. Il compilatore Arduino compila C ++; questa è la fine.
underscore_d

7
Quindi, se sto capendo questo diritto: fintanto che i tuoi modificatori di visibilità sono espliciti, non omessi, non importa. Potresti scrivere un'enorme applicazione C ++ usando nient'altro che le strutture; o potresti passare attraverso e cambiare ogni caso di struct in class. Se non si utilizza la visibilità predefinita, le applicazioni saranno esattamente le stesse.
Ryan Lundy,

Non sono convinto che un'unità di traduzione di un programma C ++ può avere la dichiarazione completa class foo { public: ... };e un'altra può avere struct foo { ... };che dovrebbe valere secondo l'affermazione "assolutamente equivalente". Viene alla ragione che le dichiarazioni incomplete struct foo;e class foo;sono intercambiabili. Questi non specificano il corpo della classe e quindi non parlano nulla al layout di accesso.
Kaz,

@Kaz: Hai ragione - se le definizioni erano letteralmente dello stesso tipo, devono essere lessicamente identiche affinché il comportamento sia ben definito. La chiave di struttura e la chiave di classe sono comunque logicamente scambiabili (laddove la semantica non è influenzata) Fooe Barsono ancora tipi equivalenti / identici. Mi sono assicurato di dire "quando redeclaring " e dare un esempio. Vieni a pensarci bene, lo chiarirò nella risposta per assicurarmi di non fuorviare le persone in UB
Lightness Races in Orbit

54

L'unica volta che utilizzo una struttura anziché una classe è quando dichiaro un funzione subito prima di usarlo in una chiamata di funzione e voglio minimizzare la sintassi per motivi di chiarezza. per esempio:

struct Compare { bool operator() { ... } };
std::sort(collection.begin(), collection.end(), Compare()); 

35
Ora che sono passati diversi anni e C ++ 11 è supportato da tutti i principali compilatori, Lambdas lo rende ancora più conciso .

36

Dalla FAQ Lite C ++ :

I membri e le classi di base di uno struct sono pubblici per impostazione predefinita, mentre in classe sono automaticamente privati. Nota: è necessario rendere le classi di base esplicitamente pubbliche, private o protette, anziché fare affidamento sui valori predefiniti.

struct e class sono altrimenti funzionalmente equivalenti.

OK, abbastanza di quel discorso techno perfettamente pulito. Emotivamente, la maggior parte degli sviluppatori fa una forte distinzione tra una classe e una struttura. Una struttura sembra semplicemente una pila aperta di bit con molto poco in termini di incapsulamento o funzionalità. Una classe si sente come un membro vivente e responsabile della società con servizi intelligenti, una forte barriera di incapsulamento e un'interfaccia ben definita. Dal momento che questa è la connotazione che molte persone hanno già, probabilmente dovresti 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.


1
Non capisco perché stiano affermando che la struttura e la classe sono funzionalmente uguali, ma dicono di preferire l'una all'altra in alcuni casi senza alcun ragionamento.
Deetz,

3
Il motivo è la convenzione. Il compilatore non si preoccupa di quello che usi, ma un altro sviluppatore che guarda il tuo codice avrà più tempo a capire cosa intendevi.
Tal Pressman,

3
@deetz: l'intero terzo paragrafo è un ragionamento.
Razze di leggerezza in orbita,

Caspita, venendo dalla "vecchia scuola" non avevo idea che una struttura potesse avere metodi e persino eredità. Ho sempre usato struct per quando usavo solo i dati senza metodi e di solito è quando ho a che fare con il codice API che ha bisogno di struct. Le strutture possono supportare anche l'ereditarietà multipla?
Paul McCarthy,

21

Un posto in cui una struttura mi è stata utile è quando ho un sistema che riceve messaggi in formato fisso (ad esempio una porta seriale) da un altro sistema. È possibile eseguire il cast del flusso di byte in una struttura che definisce i campi e quindi accedere facilmente ai campi.

typedef struct
{
    int messageId;
    int messageCounter;
    int messageData;
} tMessageType;

void processMessage(unsigned char *rawMessage)
{
    tMessageType *messageFields = (tMessageType *)rawMessage;
    printf("MessageId is %d\n", messageFields->messageId);
}

Ovviamente, questa è la stessa cosa che faresti in C, ma trovo che l'overhead di dover decodificare il messaggio in una classe di solito non ne valga la pena.


Lo stesso si può ottenere in C.
Eugene Bujak il

11
Oppure potresti semplicemente implementare operator >>una classe invece di scrivere la processMessagefunzione, il che renderebbe il tuo C ++ più simile al C ++ corretto e meno al C.
Nick Bastin,

1
Oltre al fatto che non è portatile tra sistemi diversi, questo viola le regole di aliasing, quindi non è garantito che funzioni anche all'interno di una singola architettura.
underscore_d

@underscore_d Questo può funzionare in modo indipendente dalla piattaforma (ma non dal compilatore), ma è necessario utilizzare bitfield fissi, una __packed__struttura e disporre di un implementaion ifdef compatibile con endian (è necessario capovolgere l'ordine su una macchina in cui l'endianess è opposta a quella dell'origine dati esterna sta fornendo). Non è carino, ma ho usato per comprimere / decomprimere i registri per periferiche remote su piattaforme integrate in modo portatile.
crasic

1
@jacwah Huh, buon punto. Aliasing non sarà un problema qui perché uno dei puntatori è un chartipo, che sono esenti da aliasing. Tuttavia, c'è ancora un problema, sebbene diverso: se si esegue il cast char*di un tipo diverso, se in realtà non vi era alcun oggetto di quest'ultimo tipo già inizializzato a quell'indirizzo, è UB in quanto viola le regole di vita. Dopo tutto, anche se il tipo di destinazione è banalmente costruibile, la sola allocazione di memoria non è sufficiente per C ++ per consentire formalmente di trattare quella memoria come quel tipo.
underscore_d

19

Puoi usare "struct" in C ++ se stai scrivendo una libreria i cui interni sono C ++ ma l'API può essere chiamata con il codice C o C ++. È sufficiente creare una singola intestazione che contenga strutture e funzioni API globali esposte al codice C e C ++ in questo modo:

// C access Header to a C++ library
#ifdef __cpp
extern "C" {
#endif

// Put your C struct's here
struct foo
{
    ...
};
// NOTE: the typedef is used because C does not automatically generate
// a typedef with the same name as a struct like C++.
typedef struct foo foo;

// Put your C API functions here
void bar(foo *fun);

#ifdef __cpp
}
#endif

Quindi puoi scrivere una barra delle funzioni () in un file C ++ usando il codice C ++ e renderla richiamabile da C e i due mondi possono condividere i dati attraverso le strutture dichiarate. Naturalmente ci sono altri avvertimenti quando si mescolano C e C ++ ma questo è un esempio semplificato.


2
La risposta migliore. La compatibilità C è davvero il motivo più importante. tutte le altre cose come l'accesso predefinito sono esoteriche.
Valentin Heinitz,

16

Come tutti dicono, l'unica vera differenza è l'accesso predefinito. Ma uso particolarmente struct quando non desidero alcun tipo di incapsulamento con una semplice classe di dati, anche se implemento alcuni metodi di supporto. Ad esempio, quando ho bisogno di qualcosa del genere:

struct myvec {
    int x;
    int y;
    int z;

    int length() {return x+y+z;}
};

1
+1 per dare un esempio di una struttura con alcune funzioni membro che non sembrano aver "tolto la struttura".
einpoklum,

9

Per rispondere alla mia domanda (spudoratamente), Come già accennato, i privilegi di accesso sono l'unica differenza tra loro in C ++.

Tendo a usare una struttura solo per l'archiviazione dei dati. Gli permetterò di ottenere alcune funzioni di aiuto se semplifica il lavoro con i dati. Tuttavia, non appena i dati richiedono il controllo del flusso (ovvero getter / setter che mantengono o proteggono uno stato interno) o iniziano ad acquisire qualsiasi funzionalità principale (sostanzialmente più simile ad un oggetto), verranno "aggiornati" a una classe per comunicare meglio l'intento.


9

Le strutture ( POD , più in generale) sono utili quando si fornisce un'interfaccia C-compatibile con un'implementazione C ++, poiché sono trasportabili attraverso i confini del linguaggio e i formati di linker.

Se questo non ti riguarda, suppongo che l'uso di "struct" invece di "class" sia un buon comunicatore di intenti (come ha detto @ZeroSignal sopra). Le strutture hanno anche una semantica di copia più prevedibile, quindi sono utili per i dati che intendi scrivere su supporti esterni o inviare attraverso il filo.

Le strutture sono utili anche per varie attività di metaprogrammazione, come modelli di tratti che espongono solo un mucchio di typedef dipendenti:

template <typename T> struct type_traits {
  typedef T type;
  typedef T::iterator_type iterator_type;
  ...
};

... Ma questo sta davvero sfruttando il livello di protezione predefinito di struct essendo pubblico ...


1
Questo non è l'uso corretto di POD. Una struttura (o classe) può essere una struttura POD se (e solo se) contiene SOLO membri POD.
Martin York,

4
"prevedibile copia della semantica": le simantiche sono le stesse della classe (e hanno gli stessi problemi (copia superficiale)).
Martin York,

2
Questo post vorrebbe farti credere (si spera per caso) che tutte le strutture siano POD. Questo non è affatto vero. Spero che le persone non siano fuorvianti da questo.
Michael Dorst,

8

Per C ++, non c'è davvero molta differenza tra le strutture e le classi. La principale differenza funzionale è che i membri di una struttura sono pubblici per impostazione predefinita, mentre sono privati ​​per impostazione predefinita nelle classi. Altrimenti, per quanto riguarda la lingua, sono equivalenti.

Detto questo, tendo a usare le strutture in C ++ come faccio in C #, in modo simile a quello che ha detto Brian. Le strutture sono semplici contenitori di dati, mentre le classi vengono utilizzate per gli oggetti che devono agire sui dati oltre a limitarsi a trattenerli.


4

Sono praticamente la stessa cosa. Grazie alla magia del C ++, una struttura può contenere funzioni, usare l'ereditarietà, creata usando "nuovo" e così via proprio come una classe

L'unica differenza funzionale è che una classe inizia con diritti di accesso privati, mentre una struttura inizia con pubblico. Questa è la compatibilità retroattiva con C.

In pratica, ho sempre usato le strutture come supporti dati e le classi come oggetti.


4

Come altri hanno sottolineato

  • entrambi sono equivalenti a parte la visibilità predefinita
  • ci possono essere motivi per essere costretti a usare l'uno o l'altro per qualunque motivo

C'è una chiara raccomandazione su quando usare quali da Stroustrup / Sutter:

Usa la classe se la classe ha un invariante; utilizzare struct se i membri dei dati possono variare in modo indipendente

Tuttavia, tieni presente che non è saggio inoltrare la dichiarazione sth. come classe ( class X;) e definirlo come struct ( struct X { ... }). Potrebbe funzionare su alcuni linker (ad esempio, g ++) e potrebbe fallire su altri (ad esempio, MSVC), quindi ti ritroverai all'inferno degli sviluppatori.


Puoi descrivere questi problemi di linker?
Corse di leggerezza in orbita

@LightnessRacesinOrbit Non posso purtroppo. Non sono nemmeno in grado di creare un esempio. Il banale class Foo; struct Foo { void bar() {} }; int main() { Foo().bar(); }non solo si compila e funziona con MSVC 2017, ma produce anche un chiaro avvertimento che è Foostato dichiarato come structma definito come class. Ma ricordo anche chiaramente che è costato mezza giornata alla nostra squadra trovare quello stupido insetto. Non sono sicuro di quale versione MSVC abbiamo usato allora.
pasbi,

Il linker non dovrebbe nemmeno sapere se hai usato classo structsu una dichiarazione in avanti, e i due sono liberamente intercambiabili secondo lo standard (anche se è noto che VS avverte; ho sempre pensato che fosse solo per evitare apparenti errori del programmatore). Qualcosa non ha odore proprio qui. Sei sicuro che non sia stato un bug di violazione ODR?
Corse della leggerezza in orbita


Non ricordo esattamente. Il problema non si è verificato direttamente in un'applicazione, ma in una libreria utilizzata in gtest. So solo che il linker ha prodotto errori incomprensibili (LNK ???). Una volta sostituito i struct-forward a class-forwards, i problemi sono scomparsi. Ad oggi lo trovo anche strano. Sarei felice se potessi far luce su di esso.
pasbi,

3

Classe.

I membri della classe sono privati ​​per impostazione predefinita.

class test_one {
    int main_one();
};

È equivalente a

class test_one {
  private:
    int main_one();
};

Quindi se ci provi

int two = one.main_one();

Avremo un errore: main_one is privateperché non è accessibile. Possiamo risolverlo inizializzandolo specificando che è pubblico cioè

class test_one {
  public:
    int main_one();
};

Struct.

Una struttura è una classe in cui i membri sono pubblici per impostazione predefinita.

struct test_one {
    int main_one;
};

Il mezzo main_oneè privato cioè

class test_one {
  public:
    int main_one;
};

Uso le strutture per le strutture di dati in cui i membri possono assumere qualsiasi valore, in questo modo è più semplice.


3

Un vantaggio di structover classè che salva una riga di codice, se aderisce ai "primi membri pubblici, quindi privati". In questa luce, trovo la parola chiave classinutile.

Ecco un altro motivo per usare solo structe mai class. Alcune linee guida sullo stile di codice per C ++ suggeriscono l'uso di lettere minuscole per le macro di funzioni, la logica è che quando la macro viene convertita in una funzione incorporata, non è necessario modificare il nome. Anch'io. Hai la tua bella struttura in stile C e un giorno scoprirai che devi aggiungere un costruttore o un metodo di convenienza. Lo cambi in un class? Ovunque?

Distinguere tra se structe classes è troppo fastidioso, mettendosi in cammino nel fare ciò che dovremmo fare - la programmazione. Come molti dei problemi di C ++, nasce dal forte desiderio di compatibilità con le versioni precedenti.


Perché dovresti cambiarlo in a class? Pensavi che una classe definita con la structparola chiave non potesse avere funzioni membro o un costruttore?
Razze di leggerezza in orbita,

@LightnessRacesinOrbit a causa di 1. coerenza e 2. alcuni analizzatori statici lamentano la violazione di 1.
Vorac,

Questo non segue. A quali altre "consistenze" aderisci? Ogni classe con un membro chiamato joe()deve essere definita con una classparola chiave? Ogni classe con almeno 4 intmembri deve essere definita con una structparola chiave?
Corse della leggerezza in orbita,

@LightnessRacesinOrbit Mi riferisco al linguaggio "Gli aggregati POD sono definiti con struct, gli aggregati con metodi sono definiti con class". Troppa seccatura.
Vorac,

2

sono la stessa cosa con impostazioni predefinite diverse (private per impostazione predefinita classe public per impostazione predefinita per struct), quindi in teoria sono totalmente intercambiabili.

quindi, se voglio solo impacchettare alcune informazioni per spostarmi, uso uno struct, anche se ho messo alcuni metodi lì (ma non molti). Se è una cosa per lo più opaca, in cui l'uso principale sarebbe tramite metodi e non direttamente ai membri dei dati, utilizzo una classe completa.


2

Le strutture di default hanno accesso pubblico e le classi di default hanno accesso privato.

Personalmente uso le strutture per oggetti di trasferimento dati o come oggetti valore. Se usato come tale dichiaro tutti i membri come const per impedire la modifica con altro codice.


2

Entrambi structe classsono gli stessi sotto il cofano, sebbene con impostazioni predefinite diverse per quanto riguarda la visibilità, il structvalore predefinito è pubblico e il classvalore predefinito è privato. È possibile modificare l'uno e l'altro con l'uso appropriato di privatee public. Entrambi consentono ereditarietà, metodi, costruttori, distruttori e tutto il resto delle chicche di un linguaggio orientato agli oggetti.

Tuttavia una grande differenza tra i due è che structcome parola chiave è supportata in C mentre classnon lo è. Questo significa che si può usare un structin un includono file che può essere #includein o C ++ o C fino a quando il structè uno stile C pianura structe tutto il resto del include file è compatibile con C, vale a dire senza C ++ parole chiave specifiche, come private, public, no metodi, nessuna eredità, ecc. ecc. ecc.

Lo stile CA structpuò essere utilizzato con altre interfacce che supportano l'utilizzo dello stile C structper trasportare i dati avanti e indietro sull'interfaccia.

Lo stile CA structè un tipo di modello (non un modello C ++ ma piuttosto un modello o uno stencil) che descrive il layout di un'area di memoria. Nel corso degli anni interfacce utilizzabili da C e C con i plug-in (qui sta guardando a voi Java e Python e Visual Basic) sono stati creati alcuni dei quali lavoro con stile C struct.


1

Tecnicamente entrambi sono gli stessi in C ++ - per esempio è possibile che uno struct abbia operatori sovraccaricati, ecc.

Però :

Uso le strutture quando desidero passare simultaneamente informazioni di più tipi. Uso le classi quando ho a che fare con un oggetto "funzionale".

Spero che sia d'aiuto.

#include <string>
#include <map>
using namespace std;

struct student
{
    int age;
    string name;
    map<string, int> grades
};

class ClassRoom
{
    typedef map<string, student> student_map;
  public :
    student getStudentByName(string name) const 
    { student_map::const_iterator m_it = students.find(name); return m_it->second; }
  private :
    student_map students;
};

Ad esempio, sto restituendo uno studente struct nei metodi get ... () qui - divertiti.


1

Quando sceglieresti di usare struct e quando usare la classe in C ++?

Uso structquando definisco functorse POD. Altrimenti lo uso class.

// '()' is public by default!
struct mycompare : public std::binary_function<int, int, bool>
{
    bool operator()(int first, int second)
    { return first < second; }
};

class mycompare : public std::binary_function<int, int, bool>
{
public:
    bool operator()(int first, int second)
    { return first < second; }
};

1
Questa risposta mostra segni di età :) std::binary_function<>non è solo deprecata, c ++ 17 la rimuove persino.
visto il

Non è una sorpresa davvero da quando è stato scritto al tempo di C ++ 03, un linguaggio definito 15 anni fa.
Razze di leggerezza in orbita,

1

Uso le strutture quando devo creare il tipo o il funzione POD.


1

Tutti i membri della classe sono privati ​​per impostazione predefinita e tutti i membri della struttura sono pubblici per impostazione predefinita. La classe ha basi private predefinite e Struct ha basi pubbliche predefinite. Struct nel caso di C non può avere funzioni membro dove come nel caso di C ++ possiamo aggiungere funzioni membro alla struttura. A parte queste differenze, non trovo nulla di sorprendente su di loro.


0

Uso struct solo quando devo conservare alcuni dati senza alcuna funzione membro associata (per operare sui dati dei membri) e accedere direttamente alle variabili dei dati.

Ad esempio: Lettura / Scrittura di dati da file e stream di socket ecc. Passaggio di argomenti di funzioni in una struttura in cui gli argomenti di funzione sono troppi e la sintassi della funzione sembra troppo lunga.

Tecnicamente non c'è grande differenza tra classe e struttura tranne l'accessibilità di default. Inoltre dipende dallo stile di programmazione come lo usi.


-4

Ho pensato che Structs fosse inteso come una struttura di dati (come una matrice di informazioni di tipo multi-data) e che le classi fossero intese per il pacchetto di codice (come raccolte di subroutine e funzioni).

:(


-6

Non uso mai "struct" in C ++.

Non riesco mai a immaginare uno scenario in cui useresti una struttura quando desideri membri privati, a meno che tu non stia volontariamente cercando di confondere.

Sembra che usare le strutture sia più un'indicazione sintattica di come verranno usati i dati, ma preferirei semplicemente creare una classe e provare a renderla esplicita nel nome della classe, o attraverso commenti.

Per esempio

class PublicInputData {
    //data members
 };

Secondo me, una "indicazione sintattica di come verranno utilizzati i dati" è una ragione perfettamente valida per usare una struttura, specialmente se l'alternativa è usare un commento o un nome nel nome della classe.
Viktor Sehr,

2
Dichiarare un non sarebbe structgià abbastanza esplicito che i membri della classe saranno, per impostazione predefinita, pubblici?
wrongusername
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.