Создание констант внутри класса

Создать константу внутри класса можно несколькими способами:

  • объявив статическую константу. Статическая константа существует в единственном экземпляре, поэтому это лучший способ. Присваивание значения статической константе внутри класса допускается только для типов int, long, long long, short, bool, char и wchar_t:
  • static const int B = 20;

Статические константы остальных типов необходимо дополнительно определять вне класса или вместо ключевого слова const использовать ключевое слово constexpr:

static constexpr double E2 = 1.3;
  • объявив обычную константу. Присвоить значение обычной константе допускается только в списке инициализации конструктора. Список указывается после двоеточия между списком параметров и телом конструктора. Пример:
const int F;
const double G;
C(): F(50), G(15.3) {  }   // Конструктор

Значение обычной константы может отличаться у разных экземпляров класса, если при инициализации указана переменная, которая передается в параметре конструктора. Пример:

const int F;               // Может иметь разные значения
const double G;
C(int i): F(i), G(15.3) {} // Конструктор

Если значение константы должно быть одинаковым для всех экземпляров класса, то вместо обычных констант следует использовать статические константы. Это позволит более экономично использовать память и компилятор сможет произвести оптимизацию программы;

  • объявив константу внутри анонимного перечисления. Таким способом можно создать только целочисленную константу.

Присвоить значение константе можно только один раз. Любая попытка повторного присваивания ей значения приведет к ошибке. Различные варианты создания константы и способы доступа к ним вне класса приведены в листинге 13.13.

Листинг 13.13. Создание констант внутри класса

#include <iostream>

class C {
public:
   // Константы внутри перечисления
   enum : int { A = 10 };
   // Инициализировать внутри класса можно только статические
   // константы типа int, long, long long, short, bool, char и wchar_t
   static const int B = 20;
   static const int D;        // Определение вне класса
   static const double E;     // Определение вне класса
   static constexpr double E2 = 1.3;
   // Присваивание значения константе в конструкторе
   const int F;
   const double G;
   C(int i): F(i), G(15.3) {} // Конструктор
};

const int C::D = 30;
const double C::E = 40.3;

int main() {
   C obj(50);
   // Обратиться можно и без создания экземпляра класса
   std::cout << C::A << std::endl;            // 10
   std::cout << obj.A << std::endl;           // 10
   std::cout << C::B << std::endl;            // 20
   std::cout << obj.B << std::endl;           // 20
   std::cout << C::D << std::endl;            // 30
   std::cout << obj.D << std::endl;           // 30
   std::cout << C::E << std::endl;            // 40.3
   std::cout << obj.E << std::endl;           // 40.3
   std::cout << C::E2 << std::endl;           // 1.3
   std::cout << obj.E2 << std::endl;          // 1.3
   // Обращение только через экземпляр
   std::cout << obj.F << std::endl;           // 50
   std::cout << obj.G << std::endl;           // 15.3
   C obj2(70);
   std::cout << obj2.F << std::endl;          // 70
   return 0;
}

Учебник C++ (MinGW-W64)
Учебник C++ (MinGW-W64) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов