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

一文带你深入了解静态成员变量/函数 在类中的应用

深入了解静态成员变量/函数在类中的应用


文章目录

  • 深入了解静态成员变量/函数在类中的应用
      • 你的笔记核心内容解析与补充
        • 1. static 修饰成员变量
        • 2. static 修饰成员函数
      • 核心概念串联:为什么静态成员有这样的特性?
        • 从内存角度理解
        • 从时间角度理解
        • 从指针角度理解
      • 静态成员的访问方式
      • 静态成员的应用场景
      • 总结
  • 总结

看完了你提供的笔记,这是关于C++中static 关键字在类中应用的总结。你的笔记结构很清晰,把 static 对成员变量成员函数的影响分别列了出来。我来帮你系统地梳理和串联一下,让这些知识点之间的逻辑关系更完整。

你的笔记核心内容解析与补充

1. static 修饰成员变量
你的笔记要点详细解释
必须在类外进行初始化静态成员变量属于类,不属于某个对象,因此不能在构造函数中初始化。必须在类外单独定义和初始化。
初始化是最先完成的静态成员在程序启动时(main函数执行前)就被初始化,生命周期贯穿整个程序。
被所有类的对象共享无论创建多少个对象,所有对象都访问同一份静态成员变量。
不属于某个对象,不受sizeof影响sizeof(类)计算的是每个对象特有的成员大小,不包括静态成员。

代码示例

classMyClass{public:staticintstaticVal;// 类内声明intnormalVal;MyClass(intval):normalVal(val){}};// 类外定义和初始化intMyClass::staticVal=100;intmain(){cout<<sizeof(MyClass)<<endl;// 输出4(只计算normalVal,staticVal不算)MyClassobj1(1);MyClassobj2(2);obj1.staticVal=200;// 修改静态成员cout<<obj2.staticVal<<endl;// 输出200,所有对象共享同一份return0;}
2. static 修饰成员函数
你的笔记要点详细解释
没有this指针静态成员函数不与任何具体对象绑定,因此没有this指针。
只能访问静态成员变量因为没有this指针,无法访问属于具体对象的非静态成员。
不能是虚函数虚函数的调用依赖this指针和虚函数表,静态函数没有this,因此不能是虚函数。

代码示例

classMyClass{private:staticintstaticVal;intnormalVal;public:MyClass(intval):normalVal(val){}// 静态成员函数staticvoidstaticFunc(){cout<<staticVal<<endl;// ✅ 可以访问静态成员// cout << normalVal << endl; // ❌ 错误:不能访问非静态成员}// 普通成员函数voidnormalFunc(){cout<<staticVal<<endl;// ✅ 普通函数可以访问静态成员cout<<normalVal<<endl;// ✅ 也可以访问非静态成员}// virtual static void virtStatic() { } // ❌ 错误:静态函数不能是虚函数};intMyClass::staticVal=100;

核心概念串联:为什么静态成员有这样的特性?

这些特性都源于一个根本原因:静态成员属于类,不属于对象

从内存角度理解
// 内存布局示意// 静态存储区(程序启动时分配,程序结束时释放)staticintMyClass::staticVal;// 只有一份,独立存在// 堆/栈(对象创建时分配,对象销毁时释放)MyClass obj1:[normalVal]// 每个对象有自己的normalValMyClass obj2:[normalVal]// 互不干扰
从时间角度理解
// 初始化顺序静态成员初始化 → main函数开始 → 创建对象 → 对象使用 → 对象销毁 → 程序结束 → 静态成员销毁// 静态成员比任何对象都"早出生",比任何对象都"晚死亡"
从指针角度理解
classMyClass{public:voidnormalFunc(){// 编译器隐含地传递了this指针// 实际上被转换为: void normalFunc(MyClass* this)}staticvoidstaticFunc(){// 没有this指针,不知道是哪个对象的上下文}};

静态成员的访问方式

静态成员可以通过两种方式访问:

classMyClass{public:staticintval;staticvoidfunc(){cout<<"static func"<<endl;}};intMyClass::val=10;intmain(){// 1. 通过类名访问(推荐,清晰表明是静态成员)cout<<MyClass::val<<endl;MyClass::func();// 2. 通过对象访问(虽然可以,但不推荐,容易混淆)MyClass obj;cout<<obj.val<<endl;// 可以,但看起来像普通成员obj.func();// 可以,但静态函数本不需要对象return0;}

静态成员的应用场景

场景示例
计数器统计创建了多少个对象
单例模式保存类的唯一实例
工具函数与类相关但不需要对象状态的函数(如数学计算)
共享配置所有对象共享的配置参数
工厂方法创建并返回类对象

计数器示例

classStudent{private:staticintcount;// 学生总数string name;public:Student(string n):name(n){count++;// 每创建一个学生,总数加1}~Student(){count--;// 学生销毁,总数减1}staticintgetCount(){returncount;// 静态函数返回静态成员}};intStudent::count=0;// 初始化为0intmain(){cout<<Student::getCount()<<endl;// 0Students1("张三");Students2("李四");cout<<Student::getCount()<<endl;// 2{Students3("王五");cout<<Student::getCount()<<endl;// 3}// s3被销毁cout<<Student::getCount()<<endl;// 2return0;}

总结

特性静态成员变量静态成员函数
归属属于类属于类
内存位置静态存储区代码区
初始化类外初始化-
this指针-
访问非静态成员-❌ 不能
访问静态成员✅ 能✅ 能
虚函数-❌ 不能
调用方式类名::成员 或 对象.成员类名::成员 或 对象.成员

你的笔记很准确地抓住了静态成员的核心特征:它们是属于类的,而不是属于某个对象的。理解这一点,就能理解为什么静态成员有这些看似特殊的规则。

总结

这篇文章是作者搜集大量面经和资料这里出来的。感谢你的支持
作者wkm是一名中国矿业大学(北京) 大一的新生,希望得到你的关注
如果可以的话,记得一键三联!

http://www.jsqmd.com/news/437127/

相关文章:

  • 2026年3月合金管厂家推荐:行业测评与选择指南 - 品牌鉴赏师
  • 政府信息公开监督保障方案怎么写,有哪些内容
  • Pandas数据处理(1): 数据的导入导出与缺失值处理
  • 空实辩证:以指月之手的理论自省
  • Spring Boot 参数验证
  • RAG-01-假设性问题索引
  • 2026年3月非标定制焊管厂家推荐,按需定制与特殊规格实力厂家 - 品牌鉴赏师
  • 2026年3月饮料灌装机厂家推荐,食品级卫生与高速灌装厂家实力 - 品牌鉴赏师
  • 深度学习的补充:神经网络处理回归困难(人脸关键点识别)自然语言处理的介绍及深度学习用于自然语言处理
  • 每日Paper | 2026年3月4日
  • 2026年3月桥式滤水管厂家推荐,水井过滤与排水专用实力厂家 - 品牌鉴赏师
  • Kimi可以做广告吗?怎么做?联系谁? - 品牌2026
  • 直接定址表学习
  • if no one works.
  • 2026年3月定尺无缝钢管厂家推荐,精准定尺切割与规格齐全厂家 - 品牌鉴赏师
  • 2026年3月不锈钢反应釜厂家推荐,耐腐蚀材质与工业级制造实力 - 品牌鉴赏师
  • 都2026年了还不会Vite插件开发?手写一个版本管理插件,5分钟包会!
  • 2026年3月15CrMoG高压锅炉管厂家推荐,合金耐高温与实力厂家 - 品牌鉴赏师
  • 给金三银四裸考前端的人一个野路子
  • 能耗数据分散难分析?这套能源监测系统源码,打通电表/水表/气表实现全局可视化
  • Linux软件编程——信号灯+共享内存
  • 昨天面了3个前端岗,都没过聊聊,被挂原因
  • VS2022:Only the invariant culture is supported in globalization-invariant mode.
  • Node.js 宣布重大调整,运行十年的规则要改了!
  • 计算机毕业设计springboot基于Vue框架的智能教研系统的设计与实现 基于SpringBoot与Vue.js的教育教学智慧管理平台设计与实现 SpringBoot结合Vue技术栈的数字化教研
  • 2026年3月水处理厂家推荐,全流程水处理解决方案与优质品牌盘点 - 品牌鉴赏师
  • 计算机毕业设计springboot同城搬家系统设计与实现 基于SpringBoot的城市短途搬迁服务平台开发 SpringBoot框架下的本地搬家业务管理系统构建
  • 从微信小程序 data-id 到 React 列表性能优化:少用闭包,多用 data-*
  • 【思维框架】霍夫斯泰德文化维度理论 是 荷兰社会心理学家吉尔特·霍夫斯泰德(Geert Hofstede)提出的 文化维度理论
  • 2026年3月压配式实心轮胎厂家推荐,压配安装稳固与专业厂家 - 品牌鉴赏师