Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π―Π·Ρ‹ΠΊ программирования C++. ΠŸΡΡ‚ΠΎΠ΅ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 279

Автор Π‘Ρ‚Π΅Π½Π»ΠΈ Π›ΠΈΠΏΠΏΠΌΠ°Π½

Π£ класса type_info Π½Π΅Ρ‚ стандартного конструктора, Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ присвоСния, конструктор ΠΊΠΎΠΏΠΈΠΉ ΠΈ пСрСмСщСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»Π΅Π½Π½Ρ‹Π΅ (см. Ρ€Π°Π·Π΄Π΅Π» 13.1.6). ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ нСльзя ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ, ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ»ΠΈ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° type_info. ЕдинствСнный способ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса type_info β€” это ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ typeid.

Ѐункция-Ρ‡Π»Π΅Π½ name() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΡƒΡŽ строку Π² стилС Π‘, ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰ΡƒΡŽ имя класса ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ΅ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°, зависит ΠΎΡ‚ компилятора ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ соотвСтствуСт ΠΈΠΌΠ΅Π½ΠΈ класса, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½ΠΎΠΌΡƒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. ЕдинствСнноС, Ρ‡Ρ‚ΠΎ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ функция name(), β€” это ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠΉ Π΅ΠΉ строки для Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Рассмотрим ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

int arr[10];

Derived d;

Base *p = &d;

cout << typeid(42).name() << ", "

     << typeid(arr).name() << ", "

     << typeid(Sales_data).name() << ", "

     << typeid(std::string).name() << ", "

     << typeid(p).name() << " , "

     << typeid(*p).name() << endl;

ΠŸΡ€ΠΈ запускС Π½Π° машинС Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅

i, A10_i, 10Sales_data, Ss, P4Base, 7Derived

Класс type_info зависит ΠΎΡ‚ компилятора. НСкоторыС компиляторы ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ…, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΡΠ½ΠΈΡ‚ΡŒ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности класса type_info для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ компилятора, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π΅Π³ΠΎ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ.

УпраТнСния Ρ€Π°Π·Π΄Π΅Π»Π° 19.2.4

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 19.9. ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΏΠΎΠ΄ΠΎΠ±Π½ΡƒΡŽ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π² ΠΊΠΎΠ½Ρ†Π΅ этого Ρ€Π°Π·Π΄Π΅Π»Π°, для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈΠΌΠ΅Π½, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… компилятором для ΠΎΠ±Ρ‰ΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². Если ваш компилятор создаСт Π²Ρ‹Π²ΠΎΠ΄, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹ΠΉ Π½Π°ΡˆΠ΅ΠΌΡƒ, Π½Π°ΠΏΠΈΡˆΠΈΡ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, которая ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ эти строки Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ½ΡΡ‚Π½ΡƒΡŽ для Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠ° Ρ„ΠΎΡ€ΠΌΡƒ.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 19.10. Π‘ ΡƒΡ‡Π΅Ρ‚ΠΎΠΌ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΉ Π½ΠΈΠΆΠ΅ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ класс ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ стандартным конструктором ΠΈ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ дСструктором, ΡƒΠΊΠ°ΠΆΠΈΡ‚Π΅, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠΎΠ² отобразят ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹?

class A { /* ... */ };

class Π’ : public A { /* ... */ };

class Π‘ : public Π’ { /* ... */ };


(a) A *pa = new Π‘;

    cout << typeid(pa).name() << endl;

(b) Π‘ cobj;

    A& ra = cobj;

    cout << typeid(&ra).name() << endl;

(c) B *px = new B;

    A& ra = *px;

    cout << typeid(ra).name() << endl;

19.3. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ (enumeration) ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½Π°Π±ΠΎΡ€Ρ‹ цСлочислСнных констант. Как ΠΈ класс, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ пСрСчислСниС опрСдСляСт Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ β€” Π»ΠΈΡ‚Π΅Ρ€Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹ (см. Ρ€Π°Π·Π΄Π΅Π» 7.5.6).

Π’ языкС Π‘++ Π΅ΡΡ‚ΡŒ Π΄Π²Π° Π²ΠΈΠ΄Π° пСрСчислСний: с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΈ с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости (scoped enumeration) Π²Π²ΠΎΠ΄ΠΈΡ‚ Π½ΠΎΠ²Ρ‹ΠΉ стандарт. Для опрСдСлСния пСрСчислСния с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова enum class (ΠΈΠ»ΠΈ enum struct), сопровоТдаСмыС ΠΈΠΌΠ΅Π½Π΅ΠΌ пСрСчислСния ΠΈ раздСляСмым запятыми списком пСрСчислитСлСй (enumerator), Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки. Π—Π° Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобкой слСдуСт Ρ‚ΠΎΡ‡ΠΊΠ° с запятой:

enum class open_modes {input, output, append};

Π—Π΄Π΅ΡΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Ρ‚ΠΈΠΏ пСрСчислСния open_modes с трСмя пСрСчислитСлями: input, output ΠΈ append.

Π’ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ пСрСчислСния с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости (unscoped enumeration) ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово class (ΠΈΠ»ΠΈ struct) отсутствуСт. Имя пСрСчислСния с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости Π½Π΅ являСтся ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ:

enum color {red, yellow, green}; // пСрСчислСниС с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ

                                 // ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости

// бСзымянноС пСрСчислСниС с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости

enum {floatPrec = 6, doublePrec = 10, double_doublePrec = 10};

Если пСрСчислСниС являСтся бСзымянным, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ Π΅Π³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² составС опрСдСлСния пСрСчислСния. Подобно ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ класса, здСсь ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ раздСляСмый запятыми список объявлСний ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π°ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΠΈΠ³ΡƒΡ€Π½ΠΎΠΉ скобкой ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ с запятой, Π·Π°Π²Π΅Ρ€ΡˆΠ°ΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ пСрСчислСния (см. Ρ€Π°Π·Π΄Π΅Π» 2.6.1).

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΠΈ

ИмСна пСрСчислитСлСй Π² пСрСчислСнии с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΏΠΎΠ΄Ρ‡ΠΈΠ½ΡΡŽΡ‚ΡΡ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ областСй видимости ΠΈ нСдоступны Π²Π½Π΅ области видимости пСрСчислСния. ИмСна пСрСчислитСлСй Π² пСрСчислСнии с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости находятся Π² Ρ‚ΠΎΠΉ ΠΆΠ΅ области видимости, Ρ‡Ρ‚ΠΎ ΠΈ само пСрСчислСниС:

enum color {red, yellow, green}; // пСрСчислСниС с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ

                                 // ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости

enum stoplight {red, yellow, green}; // ошибка: ΠΏΠ΅Ρ€Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅

                                     // пСрСчислитСлСй

enum class peppers {red, yellow, green}; // ok: пСрСчислитСли

                                         // ΡΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ся

color eyes = green; // ok: пСрСчислитСли находятся Π² области видимости

              // для пСрСчислСния с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости

peppers p = green; // ошибка: пСрСчислитСли ΠΈΠ· peppers Π½Π΅ находятся Π²

                   // области видимости

                   // color::green находится Π² области видимости,

                   // Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ

color hair = color::red; // ok: ΠΊ пСрСчислитСлям ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ явно

peppers p2 = peppers::red; // ok: использованиС red из peppers

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ значСния пСрСчислитСлСй Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с 0, ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ пСрСчислитСля Π½Π° 1 большС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ. Однако Π²ΠΏΠΎΠ»Π½Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… пСрСчислитСлСй:

enum class intTypes {

 charTyp = 8, shortTyp = 16, intTyp = 16,

 longTyp = 32, long_longTyp = 64

};

Как ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ пСрСчислитСлСй intTyp ΠΈ shortTyp, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСчислитСля Π½Π΅ обязано Π±Ρ‹Ρ‚ΡŒ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ. Π‘Π΅Π· ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСрСчислитСля Π±ΡƒΠ΄Π΅Ρ‚ Π½Π° 1 большС, Ρ‡Π΅ΠΌ Ρƒ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ.

ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ константами, ΠΈ ΠΈΡ… ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ константными выраТСниями (см. Ρ€Π°Π·Π΄Π΅Π» 2.4.4). Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ сам являСтся константным Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пСрСчислитСли β€” константныС выраТСния, ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ константныС выраТСния. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ constexpr Ρ‚ΠΈΠΏΠ° пСрСчислСния:

constexpr intTypes charbits = intTypes::charTyp;

Π’ΠΎΡ‡Π½ΠΎ Ρ‚Π°ΠΊ ΠΆΠ΅ пСрСчислСниС ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ switch, Π° значСния Π΅Π³ΠΎ пСрСчислитСлСй ΠΊΠ°ΠΊ ΠΌΠ΅Ρ‚ΠΊΠΈ Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² case (см. Ρ€Π°Π·Π΄Π΅Π» 5.3.2). По Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅ Ρ‚ΠΈΠΏ пСрСчислСния ΠΌΠΎΠΆΠ½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ значСния шаблона (см. Ρ€Π°Π·Π΄Π΅Π» 16.1.1) ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ статичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ Ρ‚ΠΈΠΏΠ° пСрСчислСния Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ класса (см. Ρ€Π°Π·Π΄Π΅Π» 7.6).

Подобно классам, пСрСчислСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π½ΠΎΠ²Ρ‹Π΅ Ρ‚ΠΈΠΏΡ‹

ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ пСрСчислСниС ΠΈΠΌΠ΅Π΅Ρ‚ имя, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этого Ρ‚ΠΈΠΏΠ°. ΠžΠ±ΡŠΠ΅ΠΊΡ‚ пСрСчислСния ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½ ΠΈΠ»ΠΈ присвоСн Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· своих пСрСчислитСлСй ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρƒ Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° пСрСчислСния:

open_modes om = 2;      // ошибка: 2 Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚ΠΈΠΏΠ° open_modes

om = open_modes::input; // ok: input - ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ open_modes

ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈΠ»ΠΈ пСрСчислитСли Ρ‚ΠΈΠΏΠ° пСрСчислСния с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости автоматичСски ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² цСлочислСнный Ρ‚ΠΈΠΏ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΎΠ½ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΡ‹ Ρ‚Π°ΠΌ, Π³Π΄Π΅ трСбуСтся цСлочислСнноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅:

int i = color::red; // ok: ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒ пСрСчислСния с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ

                    // ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости нСявно ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ Π² Ρ‚ΠΈΠΏ int

int j = peppers::red; // ошибка: пСрСчислСния с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ

                      // видимости нСявно Π½Π΅ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ

ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° пСрСчислСния

Π₯отя ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ пСрСчислСниС опрСдСляСт ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΎΠ½ΠΎ прСдставляСтся ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· встроСнных цСлочислСнных Ρ‚ΠΈΠΏΠΎΠ². По Π½ΠΎΠ²ΠΎΠΌΡƒ стандарту ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΈΠΏ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π·Π° ΠΈΠΌΠ΅Π½Π΅ΠΌ пСрСчислСния ΠΈ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ:

enum intValues : unsigned long long {

 charTyp = 255, shortTyp = 65535, intTyp = 65535,

 longTyp = 4294967295UL,

 long_longTyp = 18446744073709551615ULL

};

Если Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π½Π΅ Π·Π°Π΄Π°Π½, Ρ‚ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ пСрСчислСния с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости ΠΈΠΌΠ΅ΡŽΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ int. Для пСрСчислСний с Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости Ρ‚ΠΈΠΏΠ° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅Ρ‚; извСстно Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ достаточно Π²Π΅Π»ΠΈΠΊ для содСрТания значСния пСрСчислитСля. Когда Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ опрСдСляСтся (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ нСявноС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для пСрСчислСния с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ видимости), ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ° создания пСрСчислитСля, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ прСвосходит Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС.