Because static data members must be
explicitly defined in exactly one compilation unit. If you didn't do
this, you'll probably get an "undefined external" linker error. For
example:
// Fred.h
class Fred {
public:
...
private:
static int j_; // Declares static data member Fred::j_
...
};
The linker will holler at you (
"Fred::j_ is not defined") unless you
define (as opposed to merely declare)
Fred::j_ in (exactly) one of your
source files:
// Fred.cpp
#include "Fred.h"
int Fred::j_ = some_expression_evaluating_to_an_int;
// Alternatively, if you wish to use the implicit 0 value for static ints:
// int Fred::j_;
The usual place to define
static data members of
class Fred is file
Fred.cpp (or
Fred.C or whatever source file extension you use).
Note: in some cases, you can add
= initializer; to the declaration of class-scope
static declarations, however if you ever use the data member,
you still need to explicitly define it in exactly one compilation unit. In
this case you don't include an = initializer in the
definition. A separate FAQ covers
this topic.