Video: Fallout 76 Tipps Und Tricks (Deutsch) 10+ Tipps für Einsteiger & Fortgeschrittene [Folge 02] 2025
Programmering handler om læsbarhed. Det er svært (faktisk det er umuligt) at skrive og vedligeholde et program, som du ikke kan læse. En del af læsning af en kildekodeoversigt er at forstå, hvad tallene der bruges i programmet repræsenterer. Den mest grundlæggende hjælp, som C ++ giver, er den allestedsnærværende #defin, som i følgende ofte citerede eksempel:
#define PI 3. 141592653589793
Denne løsning er okay for individuelle værdier, selv om det lider af, at #define mekanisme er ikke (strengt taget) en del af C / C ++, da præprocessoren kører før kompilatoren. Som følge heraf introducerede C ++ 2011 en konstant ekspression konstruktion:
constexpr lang dobbelt PI = 3. 141592653589793;
Constexpr-søgeordet bringer konstanter ind i C ++-teltet. Denne PI har en reel type, ligesom andre C ++ variabler. C ++ kan generere fejlmeddelelser med PI, der giver meget mere mening end dem der involverer 3. 14159.
Konstant udtryk er fint for individuelle konstante værdier, men ofte repræsenterer konstanter sæt af ting i stedet for naturlige konstanter som i følgende eksempel:
#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … og så videre …
Formentlig bruges disse konstanter til at identificere de stater, der måske anvendes som et indeks i en matrix af statlige objekter eller som en værdi i en database et eller andet sted.
C ++ har længe haft en forbedret mekanisme til at definere disse typer af konstanter - opregningen:
enum STATE {DC_OR_TERRITORY, // får 0 ALABAMA, // får 1 ALASKA, // får 2 ARKANSAS, // … og snart…};
Enum-søgeordet introducerer en sekvens af konstanter kaldet en "opregning". I dette tilfælde bærer opregningen navnet STATE. Hvert element i denne opgørelse er tildelt en værdi, der starter ved 0 og øges successivt med 1, så DC_OR_TERRITORY er defineret som 0, ALABAMA er defineret som 1 og så videre. Du kan tilsidesætte denne inkrementelle sekventering ved at bruge en tildelingserklæring som følger:
ENUM STATUS {DC, TERRITORY = 0, ALABAMA, ALASKA, // … og så videre …};
Denne version af STATE definerer et element DC, som er angivet med værdien 0. Det definerer derefter et nyt element TERRITORY, som også tildeles værdien 0. ALABAMA vælger 1, lige som før.
I praksis kan programmereren bruge opgørelser til at skrive helt læsbar kode som følgende:
double taxRate (STATE s) {return tax ratesByState [s];}
Det eneste problem med denne tilgang er, at denne opregning opretter ikke en ny type (som du måske tror).Faktisk er STATE ifølge standarden bare et andet navn til int - og konstanterne ALABAMA, ALASKA og så videre er alle type const int.
Gcc-kompilatoren giver faktisk en enum deklareret på denne måde lidt mere autoritet end blot at kalde det en anden form for int. Du kan faktisk overbelaste funktioner baseret på en enum type:
void fn (STATE s); void fn (int n); fn (ALASKA); // påberåber fn (STATE)
2011-standarden giver programmereren mulighed for at oprette en helt ny type ved hjælp af enum-søgeordet. Da skaberne af den nye standard ikke ønskede at bryde eksisterende kode, kræver standarden at tilføje et ekstra søgeord for at definere en opregningstype som i følgende eksempel:
enum klasse STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … og så videre …};
En opregningsklasse er nu en fuldskala type som enhver anden brugerdefineret klasse. Følgende er ikke engang lovlig af to grunde:
int s = ALASKA;
For det første defineres den konstante ALASKA kun inden for STATE navneområdet. Således er konstantens navn STATE:: ALASKA. For det andet er typen ikke int men STAT. Du kan ikke tildele en værdi af typen STATE til en int.
STATUS s = STAT:: ALASKA;
Programmeren kan omdanne en stat til en int, men hun skal gøre det eksplicit. Foretrukne konverteringer skal ikke skære det med opregningsklasser:
int n = (int) STAT:: ALASKA;
Denne nye enumtype kan også baseres på en af de andre tælleantalstyper udover bare int:
enum klasse STATE: char {DC, // … resten af erklæringen er den samme