Static data members of global classes have external linkage and can be initialized in file scope like other global objects. Static data members follow the usual class access rules, except that they can be initialized in file scope. Static data members and their initializers can access other static private and protected members of their class. The initializer for a static data member is in the scope of the class declaring the member.
The following example shows how you can initialize static
members using other static members, even though these members are
private:
class C { static int i; static int j; static int k; static int l; static int m; static int n; static int p; static int q; static int r; static int s; static int f() { return 0; } int a; public: C() { a = 0; } };
C c; int C::i = C::f(); // initialize with static member function int C::j = C::i; // initialize with another static data member int C::k = c.f(); // initialize with member function from an object int C::l = c.j; // initialize with data member from an object int C::s = c.a; // initialize with nonstatic data member int C::r = 1; // initialize with a constant value
class Y : private C {} y; int C::m = Y::f(); int C::n = Y::r; int C::p = y.r; // error int C::q = y.f(); // error
The initializations of C::p and C::x cause errors because y is an object of a class that is derived privately from C, and its members are not accessible to members of C.
You can only have one definition of a static member in a program. If a static data member is not initialized, it is assigned a zero default value. Local classes cannot have static data members.
Using the Class Access
Operators with Static Members
Example of Static Data Members
Example of Static Data Members in
Templates
File Scope
Static Member Functions
Static Members
Member Access
Local Classes