c++ 靜態變量,經常會放到cpp文件中初始化。但並非一定要放到cpp中初始化.
之所以需要放到cpp中初始化,是因為static變量,必需切只能一次被初始化。
如果放到頭文件.h中,兩個cpp都include了.h文件,那就變成了"multiple definition"。但是如果只會被include一次,放到.h中是可以編譯通過的。
問題的核心在於 " 必需切只能一次被初始化 "
例如: static_test.h, main.cpp,static 變量在.h中初始化, 如下:
static_test.h
#include <iostream> class A { public: void print() { std::cout << "my data:" << m_a << " static data: " << a << std::endl; } void print2(); public: static int a; private: int m_a = 1; }; int A::a = 4;
main.cpp:
#include "static_test.h" int main() { A a; a.print(); //a.print2(); return 0; }
以上能正常編譯.
但是,當增加新的cpp文件,static_test.cpp, include "static_test.h" 之后,編譯就異常了。
#include "static_test.h" // int A::a = 4; void A::print2() { std::cout << "print again ----- my data:" << m_a << " static data: " << a << std::endl; }
此時需要,將int A::a = 4 的實現,放到cpp文件中。