(Обновление: поскольку вопрос был изменен на static const
участников)
Объявляя их static const
, это безопасно для целочисленных переменных. В современном C ++ нет разницы в объявлении их как static constexpr
. Язык гарантирует, что вы не столкнетесь с проблемами доступа к неинициализированным (или, скорее, нулевым) числовым значениям.
Для чисел с плавающей запятой, таких как double, он не должен компилироваться, если вы не используете constexpr
. Однако эта функция недоступна в C ++ 98. Без constexpr
вы получите такую ошибку компиляции:
// gcc
example.cpp:6:25: error: ‘constexpr’ needed for in-class initialization of static data member ‘const double bank::BankAccount::balance’ of non-integral type [-fpermissive]
6 | static const double balance = 0.0;
| ^~~~~~~
Или только с нестандартными функциями:
// clang with -Wall -std=c++98
example.cpp:6:25: warning: in-class initializer for static data member of type 'const double' is a GNU extension [-Wgnu-static-float-init]
static const double balance = 0.0;
(Старый ответ без объявления их const
, но с их неконстантными)
Вы уверены в этом примере? Не думаю, что он будет компилироваться (как на C ++ 98, так и на современном C ++). Вы получите что-то подобное, если не переместите инициализацию за пределы определения класса:
// gcc
example.cpp:5:30: error: ISO C++ forbids in-class initialization of non-const static member ‘bank::BankAccount::account_number’
5 | static unsigned long int account_number = 123456789;
| ^~~~~~~~~~~~~~
example.cpp:6:19: error: ‘constexpr’ needed for in-class initialization of static data member ‘double bank::BankAccount::balance’ of non-integral type [-fpermissive]
6 | static double balance = 0.0;
| ^~~~~~~
// clang
example.cpp:5:30: error: non-const static data member must be initialized out of line
static unsigned long int account_number = 123456789;
^ ~~~~~~~~~
example.cpp:6:19: error: non-const static data member must be initialized out of line
static double balance = 0.0;
^ ~~~
Если вы его переместите, то можете потерпеть фиаско с порядком статической инициализации. Значения будут начинаться с инициализации нулями, а затем в зависимости от компоновщика будет выполняться реальный код инициализации.
Было бы безопасно, если бы переменную можно было объявить как константу.
person
Philipp Claßen
schedule
24.04.2021
account_number
иbalance
, где вы видите проблемы с заказом? Эти две переменные не связаны друг с другом. AFAIK, члены класса должны быть инициализированы в объявленном порядке, но в этом случае это независимо. Было бы иначе, если бы одна статическая переменная зависела от другой (например, конструктор 2-го в зависимости от построенного 1-го). - person Scheff's Cat   schedule 24.04.2021account_number
иbalance
подходящие кандидаты на то, чтобы бытьstatic
? Я скорее не буду. Это приведет к тому, что каждый экземплярBankAccount
будет иметь одни и те же членыaccount_number
иbalance
(с одинаковым хранилищем). (Это то, что означает член переменной классаstatic
в C ++.) Если бы это был мой банковский счет, я бы немедленно переключился в другой банк ... - person Scheff's Cat   schedule 24.04.2021