http://www.parashift.com/c++-faq-lite/link-errs-static-data-mems.html
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.