static
Data MembersOrdinarily, class static
members may not be initialized in the class body. However, we can provide in-class initializers for static
members that have const
integral type and must do so for static
members that are constexpr
s of literal type (§ 7.5.6, p. 299). The initializers must be constant expressions. Such members are themselves constant expressions; they can be used where a constant expression is required. For example, we can use an initialized static
data member to specify the dimension of an array member:
class Account {
public:
static double rate() { return interestRate; }
static void rate(double);
private:
static constexpr int period = 30;// period is a constant expression
double daily_tbl[period];
};
If the member is used only in contexts where the compiler can substitute the member’s value, then an initialized const
or constexpr static
need not be separately defined. However, if we use the member in a context in which the value cannot be substituted, then there must be a definition for that member.
For example, if the only use we make of period
is to define the dimension of daily_tbl
, there is no need to define period
outside of Account
. However, if we omit the definition, it is possible that even seemingly trivial changes to the program might cause the program to fail to compile because of the missing definition. For example, if we pass Account::period
to a function that takes a const int&
, then period
must be defined.
If an initializer is provided inside the class, the member’s definition must not specify an initial value:
// definition of a static member with no initializer
constexpr int Account::period; // initializer provided in the class definition