先看一段代码:
#include <iostream> using std::cout; //class class loopsaker { public: static int a=1; // 错误! loopsaker(); }; int main(int argc, char const *argv[]) { cout<<loopsaker::a; return 0; }
这里的错误在于,不能在class的定义里面初始化a。
来看下对的:
#include <iostream> using std::cout; //class class loopsaker { public: static int a;// 这里只是声明 loopsaker(); }; int loopsaker::a=1;//这里是定义 int main(int argc, char const *argv[]) { cout<<loopsaker::a; return 0; }
为什么,static 的变量,不能在类的里面定义呢?
1.
首先,我们需要回顾一下C++里面,关于linkage和separate compilation最重要的一条rule:
one definition rule!
https://en.wikipedia.org/wiki/One_Definition_Rule
这里面的其中一条就是,一个object,在所有的translation units中,一共只能出现一次定义。
2.
然后,再想想class的定义我们一般放在哪里。
放在头文件里面。
如果static variables的定义是放在class的定义里面的。
多个不同的文件include了这个header,会导致好几个不同的translation unit都定义了同一个object loopsaker::a;
ref: http://*.com/questions/4547660/c-static-member-variable-and-its-initialization