类的 static 成员 对于整个类来说是唯一的实例,所有对象共享一个值。
int Foo::count = 0;)。在类内我们_声明_,而在外部_定义_。this),只能访问其他静态成员。class Counter { public: static int count; static void increment() { ++count; } }; int Counter::count = 0; int main() { Counter::increment(); Counter c1, c2; c1.increment(); // count == 2 }
"静态成员的定义可以在头文件中吗?会出现什么风险?"
答案: 是的,技术上可以在头文件中定义(int Foo::value = 0;),但如果该头文件被多个翻译单元包含,会导致重复定义(multiple definition),进而产生链接错误。因此,静态成员应仅在一个 cpp 文件中定义。
故事
在库代码中,静态成员直接在头文件中定义。多次包含导致链接错误:"multiple definition of ..."。将定义移到单独的 cpp 文件后,问题消失。
故事
在教育项目中,静态成员被声明,但在外部 cpp 文件中忘了定义它。尽管在编译头文件时没有错误,但在链接时出现了 unresolved external symbol 错误。需要查找并添加缺失的定义。
故事
在大型嵌入式系统中,静态成员的初始化处理不当,使用了计算值的表达式(尝试通过需要执行代码的表达式进行初始化)。将逻辑提取到一个单独的初始化函数中,但不小心忘记在首次访问之前调用这个函数——结果是未初始化的变量和不稳定的行为。