Video: Statistical Programming with R by Connor Harris 2025
Programování se týká čitelnosti. Je těžké (vlastně není možné) psát a udržovat program, který nemůžete číst. Část čtení seznamu zdrojových kódů je pochopení toho, co čísla představují v programu. Nejzákladnější podpora, kterou poskytuje C ++, je všudypřítomná #define, jako v následujícím příkladě:
#define PI 3. 141592653589793
Toto řešení je v pořádku pro jednotlivé hodnoty, i když trpí skutečností, že mechanismus #define není (striktně řečeno) součástí C / C ++, protože předprocesor běží před kompilátorem. V reakci na to C ++ 2011 představil konstantu konstanty :
kontextr dlouhý dvojitý PI = 3. 141592653589793;
Klíčové slovo constexpr přináší konstanty do stanu C ++. Tento PI má skutečný typ, stejně jako ostatní proměnné C ++. C ++ může generovat chybové zprávy s PI, které mají mnohem větší smysl než ty, které se týkají 3. 14159.
Konstantní výrazy jsou dobré pro jednotlivé konstantní hodnoty, ale často konstanty představují množiny věcí spíše než přírodní konstanty, jako v následujícím příkladu:
#define DC_OR_TERRITORY 0 #define ALABAMA 1 #define ALASKA 2 #define ARKANSAS 3 // … a tak dále …
Předpokládá se, že tyto konstanty se používají k identifikaci států, index do pole stavových objektů nebo jako hodnota v databázi někde.
C ++ má dlouho zdokonalený mechanismus pro definování těchto typů konstant - výčet:
enum STATE {DC_OR_TERRITORY, // dostane 0 ALABAMA, // dostane 1 ALASKA, // dostane 2 ARKANSAS, // … a již brzy…};
Klíčové slovo enum představuje sekvenci konstant nazvanou "enumeration". V tomto případě obsahuje výčet název STATE. Každému prvku tohoto výčtu je přiřazena hodnota začínající na 0 a postupně zvyšující se o 1, takže DC_OR_TERRITORY je definována jako 0, ALABAMA je definována jako 1 a tak dále. Tuto přírůstkovou sekvenci můžete přepisovat pomocí příkazu assign:
enum STATE {DC, ÚZEMÍ = 0, ALABAMA, ALASKA, // … a tak dále …};
Tato verze STATE definuje prvek DC, který je dán hodnotou 0. Pak definuje nový prvek TERRITORY, který je také přiřazen hodnotě 0. ALABAMA zvedá s 1, stejně jako předtím.
Programátor může v praxi používat výčty, aby napsal zcela čitelný kód, jako je následující:
double taxRate (STATE s) {return taxRatesByState [s];}
Jediným problémem tohoto přístupu je to, nevytváří nový typ (jak si myslíte).Ve skutečnosti je podle standardu STATE jen jiný název pro int - a konstanty ALABAMA, ALASKA a tak dále jsou všechny typu const int.
Kompilátor gcc ve skutečnosti poskytuje enum takto deklarovanou trochu více autority, než jednoduše nazývat jinou formu int. Funkce můžete skutečně přetížit na základě typu enum:
void fn (STATE s); void fn (int n); fn (ALASKA); // invokes fn (STATE)
Standard pro rok 2011 umožňuje programátorovi vytvořit zcela nový typ pomocí klíčového slova enum. Vzhledem k tomu, že tvůrci nového standardu nechtěli porušovat stávající kód, standard vyžaduje přidání dalšího klíčového slova za účelem definování typu výčtu, jako v následujícím příkladu:
enum třída STATE {DC, TERRITORY = 0, ALABAMA, ALASKA, // … a tak dále …};
Třída výčtu je nyní v plném rozsahu jako každá jiná třída definovaná uživatelem. Následující není již legální ze dvou důvodů:
int s = ALASKA;
Nejprve je konstanta ALASKA definována pouze v oboru názvů STATE. Název konstanty je tedy STÁT:: ALASKA. Za druhé, typ není int, ale STATE. Hodnotu typu STATE nelze přiřadit int.
STATE s = STÁT:: ALASKA;
Programátor může přepracovat STATE do int, ale musí to udělat explicitně -implicit konverze neřízne s výčtem třídy:
int n = (int) STATE:: ALASKA;
Tento nový typ enum může být také založen na jednom z dalších typů číselných čísel kromě int:
třída enum STATE: char {DC, // … zbytek deklarace je stejný
