Casa Finanza personale Enumerazioni fortemente tipizzate in C ++ - dummies

Enumerazioni fortemente tipizzate in C ++ - dummies

Video: HACKLOG 2x09 - Come fare un WHOIS e come difendersi da un WHOIS (Information Gathering) 2024

Video: HACKLOG 2x09 - Come fare un WHOIS e come difendersi da un WHOIS (Information Gathering) 2024
Anonim

La programmazione è interamente basata sulla leggibilità. È difficile (in realtà è impossibile) scrivere e gestire un programma che non puoi leggere. Parte della lettura di un elenco di codice sorgente è capire cosa rappresentano i numeri utilizzati nel programma. L'aiuto più basilare fornito da C ++ è l'onnipresente #define, come nel seguente esempio spesso citato:

#define PI 3. 141592653589793

Questa soluzione va bene per i singoli valori, anche se soffre del fatto che il Il meccanismo #define non è (in senso stretto) una parte di C / C ++ poiché il preprocessore viene eseguito prima del compilatore. In risposta a ciò, C ++ 2011 ha introdotto un costrutto espressione costante :

constexpr long double PI = 3. 141592653589793;

La parola chiave constexpr porta le costanti nella tenda C ++. Questo PI ha un tipo reale, come altre variabili C ++. C ++ può generare messaggi di errore con PI che hanno molto più senso di quelli relativi a 3. 14159.

Le espressioni costanti vanno bene per i singoli valori costanti, ma spesso le costanti rappresentano insiemi di cose piuttosto che costanti naturali, come nell'esempio seguente:

#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … e così via …

Presumibilmente queste costanti vengono utilizzate per identificare gli stati, forse usati come un indice in una matrice di oggetti di stato o come valore in un database da qualche parte.

C ++ ha da tempo un meccanismo migliorato per definire questi tipi di costanti - l'enumerazione:

enum STATE {DC_OR_TERRITORY, // ottiene 0 ALABAMA, // ottiene 1 ALASKA, // ottiene 2 ARKANSAS, // … e presto…};

La parola chiave enum introduce una sequenza di costanti chiamata "enumerazione". In questo caso, l'enumerazione porta il nome STATE. Ad ogni elemento di questa enumerazione viene assegnato un valore che inizia da 0 e aumenta in modo sequenziale di 1, quindi DC_OR_TERRITORY è definito come 0, ALABAMA è definito come 1 e così via. È possibile sovrascrivere questa sequenza incrementale utilizzando un'istruzione di assegnazione come segue:

enum STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … e così via …};

Questa versione di STATE definisce un elemento DC, a cui viene assegnato il valore 0. Quindi definisce un nuovo elemento TERRITORY, al quale viene assegnato anche il valore 0. ALABAMA recupera con 1, proprio come prima.

In pratica, il programmatore può utilizzare le enumerazioni per scrivere codice abbastanza leggibile come il seguente:

double taxRate (STATE s) {return taxRatesByState;}

L'unico problema con questo approccio è che questa enumerazione non crea un nuovo tipo (come potresti pensare).Infatti, secondo lo standard, STATE è solo un altro nome per int - e le costanti ALABAMA, ALASKA e così via sono tutte di tipo const int.

Il compilatore gcc fornisce effettivamente un enum dichiarato in questo modo un po 'più autorevole della semplice chiamata di un'altra forma di int. È possibile sovraccaricare le funzioni in base a un tipo enum:

void fn (STATE s); void fn (int n); fn (ALASKA); // invoca fn (STATE)

Lo standard 2011 consente al programmatore di creare un tipo completamente nuovo usando la parola chiave enum. Poiché i creatori del nuovo standard non volevano interrompere il codice esistente, lo standard richiede l'aggiunta di una parola chiave extra per definire un tipo di enumerazione, come nell'esempio seguente:

classe enum STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … e così via …};

Una classe di enumerazione ora è un tipo completo come qualsiasi altra classe definita dall'utente. Quanto segue non è più legale neanche per due motivi:

int s = ALASKA;

Innanzitutto, la costante ALASKA viene definita solo all'interno dello spazio dei nomi STATE. Pertanto, il nome della costante è STATO: ALASKA. In secondo luogo, il tipo non è int ma STATE. Non è possibile assegnare un valore di tipo STATE a un int.

STATO s = STATO:: ALASKA;

Il programmatore può convertire uno STATO in un int ma deve farlo in modo esplicito - le conversioni implicite non lo tagliano con le classi di enumerazione:

int n = (int) STATO:: ALASKA;

Questo nuovo tipo di enum può anche essere basato su uno degli altri tipi di numeri di conteggio oltre a solo int:

classe enum STATE: char {DC, // … il resto della dichiarazione è lo stesso
Enumerazioni fortemente tipizzate in C ++ - dummies

Scelta dell'editore

Come utilizzare le funzionalità dell'app Klout su dispositivi Apple - dummies

Come utilizzare le funzionalità dell'app Klout su dispositivi Apple - dummies

L'esperienza mobile di Klout è più limitato rispetto al sito web completo. Tuttavia, molte funzionalità sono ancora disponibili con l'app per dispositivi mobili, incluso dare + K ai tuoi influenzatori, controllare il tuo punteggio Klout e apportare semplici modifiche al tuo profilo. E con l'implementazione di Klout per il tuo iPhone Passbook puoi persino usare Klout per ottenere ...

Metriche dei social media: App Android SDK di Google Analytics - dummies

Metriche dei social media: App Android SDK di Google Analytics - dummies

Tracciamento delle metriche di un'applicazione ( un'app) è stata semplificata, ma le app sono ancora isolate. Puoi tenere traccia di ogni app, ma le soluzioni sono ancora in fase di creazione per tenere traccia di tutte le app. Per andare avanti con Google Analytics SDK per la tua app Android, segui questi passaggi: Scarica l'SDK di Google Analytics per Android. Aggiungi la libreria libGoogleanalytics. jar ...

Metriche sui social media: individuazione del momento di trazione con Google+ - dummies

Metriche sui social media: individuazione del momento di trazione con Google+ - dummies

In i social media, il momento di trazione potrebbe anche essere chiamato il "miglior tempo per condividere su Google+ o altri siti sociali. "Il momento migliore per te potrebbe non essere il momento migliore per i tuoi colleghi generatori di contenuti. (Il merito di questo suggerimento principale va a Christopher Penn che per primo condivise la sua osservazione sulla ricerca ...

Scelta dell'editore

Combinazione di due foto sulla tua Nikon D3400 con sovrapposizione immagini - manichini

Combinazione di due foto sulla tua Nikon D3400 con sovrapposizione immagini - manichini

L'opzione Sovrapposizione immagini sulla Il menu di ritocco di Nikon D3400 consente di unire due foto in una. Questa opzione è stata utilizzata per combinare una foto di un lupo mannaro, mostrato a sinistra, con una scena da giardino notturno, mostrata nel mezzo. Il risultato è l'immagine spettrale mostrata a destra. Oooh, spaventoso! Su ...

Scelta di una modalità Esposizione per una Nikon DSLR - manichini

Scelta di una modalità Esposizione per una Nikon DSLR - manichini

La prima impostazione da prendere in considerazione quando si le riprese con la tua Nikon D3100, D5100 o D7000 sono la modalità di esposizione, che puoi selezionare tramite la ghiera dei modi. La tua scelta determina la quantità di controllo che hai rispetto a due impostazioni di esposizione critiche - diaframma e tempo di posa - oltre a molte altre opzioni, incluse quelle relative ...

Scelta del formato immagine JPEG per una reflex Nikon - dummies

Scelta del formato immagine JPEG per una reflex Nikon - dummies

Offerte Nikon D3100, D5100 o D7000 i due tipi di file comuni nella maggior parte delle fotocamere digitali odierne: JPEG e Camera Raw, o semplicemente Raw in breve, che passa dallo specifico moniker NEF (Nikon Electronic Format) sulle fotocamere Nikon. Il tipo di file, talvolta noto anche come formato file, determina come i dati dell'immagine ...

Scelta dell'editore

Comprensione della struttura delle classi Java - dummies

Comprensione della struttura delle classi Java - dummies

Impossibile creare un'applicazione Java senza creare una classe. Tuttavia, i modi in cui si usano le classi all'inizio quando si apprendono su di essi sono stati relativamente semplicistici - Java è in grado di avere una complessità considerevolmente maggiore, che è il punto di questo capitolo. Le classi hanno una struttura specifica. Proprio come i progetti ...

Come utilizzare i metodi astratti in Java - dummies

Come utilizzare i metodi astratti in Java - dummies

Sia le interfacce che le classi astratte hanno metodi astratti in Java. Ma i metodi astratti giocano ruoli leggermente diversi in questi due tipi di tipi di riferimento. Come puoi tenere tutto dritto nella tua mente? La prima cosa da fare è ricordare che nessuno impara a conoscere i concetti di programmazione orientata agli oggetti senza ottenere molti ...

Come utilizzare l'interfaccia CharSequence in Java - dummies

Come utilizzare l'interfaccia CharSequence in Java - dummies

L'API Java include un'interfaccia utile chiamata CharSequence. Tutte e tre queste classi - String, StringBuilder e StringBuffer - implementano questa interfaccia. Questo metodo esiste principalmente per consentire di utilizzare String, StringBuilder e StringBuffer in modo intercambiabile. A tal fine, molti dei metodi delle classi String, StringBuilder e StringBuffer utilizzano CharSequence come parametro ...