capl--static
一、static 总览使用位置核心作用关键行为类的静态成员变量类级共享数据所有对象共享一份类外必须定义类的静态成员函数类级工具方法无this指针通过类名调用函数内的静态局部变量值持久化只初始化一次调用间保持值二、类中的静态成员变量2.1 基本用法声明在类内用static声明定义必须在类外用类型 类名::变量名 初值;分配内存class Counter { private: static int count; // 声明这个变量属于类不属于任何对象 public: Counter() { count; } ~Counter() { count--; } int GetCount() { return count; } // 所有对象访问的是同一个 count }; int Counter::count 0; // 必须定义并初始化如果不写类外定义会怎样链接时报错undefined reference to Counter::count。类内只是声明不分配内存2.2 内存模型Counter a, b, c; // 三个对象成员存储位置份数count(static)全局数据区1 份所有对象共享其他普通成员每个对象内部每对象 1 份2.3 典型用途用途 1对象计数器class ECU { private: static int activeInstances; public: ECU() { activeInstances; } ~ECU() { activeInstances--; } static int GetActiveCount() { return activeInstances; } }; int ECU::activeInstances 0; // 随时查询当前有多少个 ECU 对象存活 write(Active ECUs: %d, ECU::GetActiveCount());用途 2全局配置参数class AppConfig { public: static int baudRate; static char logPath[256]; }; int AppConfig::baudRate 500000; char AppConfig::logPath[256] C:\\logs\\; // 任何地方直接读写 AppConfig::baudRate 250000;用途 3共享资源句柄class Logger { private: static dword fileHandle; // 所有日志对象写入同一个文件 public: static bool Open(char path[]); static void Write(char msg[]); static void Close(); }; dword Logger::fileHandle 0;三、类中的静态成员函数3.1 基本用法class MathUtils { public: static float ToFahrenheit(float celsius); static float ToCelsius(float fahrenheit); }; float MathUtils::ToFahrenheit(float celsius) { return celsius * 9.0 / 5.0 32.0; } // 调用直接用类名无需创建对象 float f MathUtils::ToFahrenheit(25.0);3.2 调用方式对比MathUtils::ToFahrenheit(25.0); // ✅ 推荐类名调用 MathUtils util; util.ToFahrenheit(25.0); // ⚠️ 也能用对象调但不推荐3.3 重要限制静态成员函数没有this指针因此能做什么不能做什么✅ 访问静态成员变量❌ 访问普通成员变量✅ 调用其他静态成员函数❌ 调用普通成员函数✅ 访问传入的参数❌ 使用thisclass Test { private: int normalVal; static int staticVal; public: static void Func() { staticVal 10; // ✅ 可以 // normalVal 5; // ❌ 错误没有 this找不到属于哪个对象 } };四、函数内的静态局部变量4.1 基本用法在函数内部用static声明的变量只初始化一次值在函数调用间保留。void CountCalls() { static int times 0; // 只在第一次调用时初始化为 0 times; write(Called %d times, times); } on key a { CountCalls(); // 第 1 次Called 1 times CountCalls(); // 第 2 次Called 2 times CountCalls(); // 第 3 次Called 3 times }4.2 与普通局部变量的对比void NormalVar() { int n 0; // 每次调用都重新初始化为 0 n; write(Normal: %d, n); // 永远输出 1 } void StaticVar() { static int s 0; // 只在第一次调用时初始化为 0 s; write(Static: %d, s); // 输出 1, 2, 3... }普通局部变量静态局部变量初始化每次调用都初始化只初始化一次生命周期函数返回即销毁直到测量结束作用域函数内部函数内部值在调用间不保留保留4.3 典型用途用途 1调用计数器void LogError(char msg[]) { static int errorCount 0; errorCount; write(Error #%d: %s, errorCount, msg); }用途 2模拟“仅执行一次”的初始化void EnsureInitialized() { static int done 0; if (!done) { done 1; // 这里的代码只会执行一次 write(System initialized.); } }用途 3缓存计算结果float GetExpensiveValue() { static float cachedResult -1; static int cached 0; if (!cached) { cached 1; cachedResult 3.1415926; // 模拟耗时计算 } return cachedResult; }五、三种 static 的对比总结class Demo { private: static int shared; // ① 类静态成员变量所有对象共享 public: static void Func() // ② 类静态成员函数无 this类名调用 { static int local 0; // ③ 函数内静态局部变量值持久 local; shared; } }; int Demo::shared 0; // ① 的类外定义类型声明位置调用/访问方式生命周期共享范围① 静态成员变量类内类名::变量名或对象.变量名测量期间该类的所有对象② 静态成员函数类内类名::函数名()或对象.函数名()随时可调用无this只能访问静态成员③ 静态局部变量函数内仅在函数内部测量期间函数的各次调用之间