再看static数据成员

当将类的某个数据成员声明为static时,该静态数据成员只能被定义一次,而且要被同类的所有对象共享。各个对象都拥有类中每一个普通数据成员的副本,但静态数据成员只有一个实例存在,与定义了多少类对象无关。
静态数据成员的用途之一是统计有多少个对象实际存在。
静态数据成员不能在类中初始化,实际上类定义只是在描述对象的蓝图,在其中指定初值是不允许的。也不能在够造函数中初始化该成员,因为静态数据成员为类的各个对象共享,那么每次创建一个类的对象则静态数据成员都要被重新初始化。
 1 #include   <iostream.h> 
 2 
 3 class   CDummy 
 4 { 
 5 public: 
 6         static   int   n; //这里只是声明
 7 }; 
 8 
 9 int   CDummy::n=9; //这里是定义加初始化
10 
11 void   main() 
12 { 
13         cout < <CDummy::n < <endl; 
14 } 

上面这样完全没问题,但是不能直接在类中初始化,比如: 

static   int   n=9; 

+++++++++++++++++++

为什么static成员一定要在类外初始化? 

        这是因为被static声明的类静态数据成员,其实体远在main()函数开始之前就已经在全局数据段中诞生了(见《Inside   The   C++   Object   Model》page247)!其生命期和类对象是异步的,(而且静态语意说明即使没有类实体的存在,其静态数据成员的实体也是存的)这个时候对象的生命期还没有开始,如果你要到类中去初始化类静态数据成员,让静态数据成员的初始化依赖于类的实体,,那怎么满足前述静态语意呢?难道类永远不被实例化,我们就永远不能访问到被初始化的静态数据成员吗? 

            所以我的朋友,为了满足C++的static语意,static成员一定要在类外初始化!

原文地址:https://www.cnblogs.com/stemon/p/3423803.html