当前位置: 首页 > news >正文

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指针,因此:

能做什么不能做什么
✅ 访问静态成员变量❌ 访问普通成员变量
✅ 调用其他静态成员函数❌ 调用普通成员函数
✅ 访问传入的参数❌ 使用this
class 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,只能访问静态成员
③ 静态局部变量函数内仅在函数内部测量期间函数的各次调用之间
http://www.jsqmd.com/news/1041591/

相关文章:

  • Bazel C++ 构建系列文档(九):远程缓存与分布式构建
  • 本地部署正常;服务器部署 POST 方法参数丢失解决方案
  • 平头哥玄铁C910 RTL开发环境实战搭建指南
  • 华为OD机试真题 新系统【数据中心最佳维护窗口】
  • Wand-Enhancer:开源方案实现游戏修改器高级功能完全免费
  • 佳木斯市黄金回收实体店怎么选?这份清单帮你货比三家 - 嵩山路大王
  • 宁波黄金回收2026年排行榜!靠谱回收机构甄选,高价变现黄金攻略 - 名奢变现站
  • 律师执业证丢了登报怎么线上办理?10分钟搞定,次日见报 - 速递信息
  • 2026年6月宁波靠谱的油雾分离器产品推荐,活性炭吸附/催化燃烧RTO/RCO装置/水帘除尘器,油雾分离器加工厂推荐 - 品牌推荐师
  • 2026保山本地连锁黄金回收,承接铂金回收白银银条回收业务+公安备案门店 - 信誉隆金银铂奢回收
  • VisualCppRedist AIO终极指南:一站式解决Windows DLL错误的完整方案
  • 2026台州2026正规漏水检测维修公司精选口碑榜TOP5权威推荐-精准定位检测漏水点-专业防水补漏堵漏维修、卫生间/厨房/屋顶/天沟/地下室/阳台防水漏水检测维修 - 安佳防水
  • 鞍山市闲置黄金变现多少钱?本地5家回收门店最新报价参考 - 马刺总冠军
  • 2026 年高清视频素材 TOP5 平台评测:本土化与国际化资源全面对比
  • 直播操作可视化:如何让观众清晰看到你的每一个精彩操作?
  • 揭阳市2026年黄金回收报价,内行人整理实体门店回收清单 - 嵩山路大王
  • FDE大模型实战指南:小白程序员必备高薪技能,速收藏!
  • OpenCloud云原生改造、服务治理与弹性扩缩容实战
  • 宝鸡市黄金回收去哪儿好?整理了5家靠谱实体店地址电话 - 马刺总冠军
  • AutoUnipus:5分钟搞定U校园网课的智能学习助手
  • 从“修不起”到“修得好”:电驴时代全链条生态如何解题后市场“三不”困局? - 速递信息
  • 2026北京正规二手包包回收怎么选 权威筛选标准+品牌梯队实测指南 - 奢侈品回收测评
  • Windows 11系统瘦身利器:Win11Debloat让电脑重获新生
  • 2026北京二手包包怎么卖最划算 内行计价定级标准与正规渠道梯队盘点 - 奢侈品回收测评
  • 2026广州海珠手表回收实测,逸程二手腕表无克扣压价 - 逸程
  • 2026哈尔滨本地连锁黄金回收,承接铂金回收白银银条回收业务+公安备案门店 - 信誉隆金银铂奢回收
  • 魔兽争霸3必备神器:WarcraftHelper让你的经典游戏焕发新生
  • Three.js 3D模型拆解动画:从基础爆炸到智能散开的进阶实现
  • 5步掌握使用Simscape Electrical设计BLDC电机控制器的核心技能
  • 构建智能数据集成中枢:从ETL到数据价值交付的完整方案