C++14中如何将类静态成员变量的初始化置于类内部?
C++14下类内封装静态计数器的替代方案
由于C14不支持inline static成员变量(该特性在C17中引入),要将静态计数器的定义完全放在类内部,最常用的替代方案是用静态成员函数封装静态局部变量,具体实现如下:
方案实现代码
#include <iostream> class Test { public: Test() {} ~Test() {} int increment(); int decrement(); // 对应栈的pop操作 private: // 封装静态计数器,返回引用以便修改 static int& numelem() { static int counter = 0; // 第一次调用时初始化,生命周期贯穿整个程序 return counter; } }; int Test::increment() { return ++numelem(); } int Test::decrement() { return --numelem(); } // 测试示例 int main() { Test t1, t2; std::cout << t1.increment() << std::endl; // 输出1 std::cout << t2.increment() << std::endl; // 输出2 std::cout << t1.decrement() << std::endl; // 输出1 return 0; }
方案说明
- 原理:静态局部变量
counter在第一次调用numelem()函数时初始化,且其生命周期与程序一致,完全满足全局计数器的需求;通过返回引用,外部成员函数可以直接修改该变量的值。 - 优势:将计数器的定义完全封装在类内部,避免了全局作用域的变量定义,同时保证了计数器的唯一性(所有类实例共享同一个计数器)。
- 适配场景:完美对应你需要的栈操作——
push时调用increment()递增计数器,pop时调用decrement()递减计数器。
补充说明
如果你的计数器是const类型(比如固定的常量),C11及以后允许直接在类内初始化const static成员变量,但由于你的计数器需要被修改,这种方式不适用。上述静态局部变量的封装方法是C14及更早版本中实现可修改类内静态计数器的标准方案。
内容的提问来源于stack exchange,提问作者Heroking18
相关产品推荐
相关产品推荐

