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

深入解析C++静态成员变量与函数

当然可以!下面是对这段 C++ 代码的逐行详细注释说明和解释,帮助你理解静态成员变量和静态成员函数的使用。


🧱 类定义部分:MyClass

 

cpp

深色版本

#include <iostream>

说明:包含标准输入输出流库,用于使用 std::cout 进行输出。

 

cpp

深色版本

class MyClass {

说明:定义一个类,名为 MyClass

 

cpp

深色版本

public:

说明:接下来的成员都是公共(public)权限,意味着外部可以访问这些成员。

 

cpp

深色版本

    static int staticValue; // 静态成员变量

说明:声明一个静态成员变量 staticValue

  • “静态”表示这个变量属于整个类本身,而不是类的某个具体对象。
  • 所有 MyClass 的对象共享同一个 staticValue
 

cpp

深色版本

    MyClass() {// 每创建一个对象,静态变量增加1staticValue++;}

说明:这是默认构造函数。每当创建一个 MyClass 对象时,该构造函数会被调用一次,并且让 staticValue 增加 1。

  • 因为 staticValue 是静态变量,它被所有对象共享,所以每创建一个对象,它的值都会递增。
 

cpp

深色版本

    static int getStaticValue() {// 静态成员函数return staticValue;}

说明:定义一个静态成员函数 getStaticValue(),用于返回静态变量 staticValue 的值。

  • 静态成员函数可以直接访问静态成员变量,但不能访问非静态成员变量或非静态成员函数。
  • 它不依赖于任何具体的对象实例。
 

cpp

深色版本

};

说明:类定义结束。


🧪 静态成员的初始化

 

cpp

深色版本

// 类外初始化静态成员变量
int MyClass::staticValue = 0;

说明:静态成员变量必须在类外进行一次定义和初始化。这里将 staticValue 初始化为 0。


🚀 主函数部分

 

cpp

深色版本

int main() {

说明:程序入口函数。

 

cpp

深色版本

    MyClass obj1, obj2;

说明

  • 创建两个 MyClass 类型的对象:obj1 和 obj2
  • 每创建一个对象,都会调用一次构造函数,从而使 staticValue 自增一次。
 

cpp

深色版本

    std::cout << MyClass::getStaticValue(); // 输出2

说明

  • 调用静态成员函数 getStaticValue(),直接通过类名 MyClass:: 调用(不需要对象)。
  • 此时已创建了两个对象,所以 staticValue == 2
  • 输出结果是 2
 

cpp

深色版本

}

说明:主函数结束。


✅ 总结

功能说明
static int staticValue;声明一个静态成员变量,属于类本身,所有对象共享
static int getStaticValue()静态成员函数,用于获取静态变量值
构造函数中对 staticValue++每次创建对象时自动计数
类外初始化 MyClass::staticValue = 0必须在类外显式初始化静态变量
MyClass::getStaticValue()无需对象即可调用

🔁 示例流程图

  1. 静态变量 staticValue 初始化为 0。
  2. 创建 obj1 → 构造函数调用 → staticValue = 1
  3. 创建 obj2 → 构造函数调用 → staticValue = 2
  4. 调用 MyClass::getStaticValue() → 返回 2
  5. 输出结果:2

如果你还想扩展功能,比如:

  • 添加析构函数,在对象销毁时减少计数;
  • 使用友元函数打印信息;
  • 或者限制只能创建一定数量的对象;

欢迎继续提问,我可以帮你实现 😊

http://www.xdnf.cn/news/570439.html

相关文章:

  • ABC 354
  • Linux上运行程序加载动态库失败
  • Redis语法大全
  • 【Flutter】创建BMI计算器应用并添加依赖和打包
  • 【HTML-5】HTML 实体:完整指南与最佳实践
  • DSP定时器的计算
  • Spring Boot集成Spring AI与Milvus实现智能问答系统
  • dali本地安装和使用
  • WSD3043 MOSFET 在吸黑头仪中的应用
  • 小数第n位--快速幂+数学
  • 软件设计师“数据流图”真题考点分析——求三连
  • System.in 的本质:输入流的方向​
  • 高效能、高可靠性——SILM94112/08-AQ可编程半桥电机驱动器
  • WordPress_Madara 本地文件包含漏洞复现(CVE-2025-4524)
  • 深入浅出:线程安全问题的原因与解决方案
  • 5月21日直播安排
  • Taro 安全区域
  • React-改变当前页class默认的样式
  • PHP 扇形的面积(Area of a Circular Sector)
  • Redis集群在NoSQL中的应用与优化策略
  • 提升加密交易效率:PumpSwap批量交易功能深度解析
  • JAVA批量发送邮件(含excel内容)
  • Proteus 51单片机仿真模拟步骤详解【附有51单片机的仿真图,仿真软件】【调试专用】
  • 【VSCode】在远程服务器Linux 系统 实现 Anaconda 安装与下载
  • 职坐标编程开发进阶路径
  • 详解Redis缓存穿透、缓存雪崩、缓存击穿:原理、场景与解决方案
  • Gradle导入旧工程报错问题解决
  • java接口自动化(二) - 接口测试的用例设计
  • springAI调用deepseek模型使用硅基流动api的配置信息
  • 分布式电源的配电网无功优化