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

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


🧱 类定义部分:MyClass

复制代码

cpp

深色版本

复制代码
#include <iostream>

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

复制代码

cpp

深色版本

复制代码
class MyClass {

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

复制代码

cpp

深色版本

复制代码
public:

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

复制代码

cpp

深色版本

复制代码
    static int staticValue; // 静态成员变量

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

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

cpp

深色版本

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

说明 :这是默认构造函数。每当创建一个 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 类型的对象:obj1obj2
  • 每创建一个对象,都会调用一次构造函数,从而使 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

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

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

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

相关推荐
彧azz6 小时前
图的存储结构详解:邻接矩阵的原理、实现与应用
开发语言·数据结构·学习·php
IT_Octopus6 小时前
IntelliJ 本地日志路径自定义:`-DLOG_PATH=./logs` 为什么总“不听话“
java·log4j·intellij-idea
嵌入式学习菌6 小时前
Modbus‑RTU 数据类型分析
开发语言·单片机·bug
长征coder6 小时前
【无标题】
java·性能优化
matlab代码7 小时前
基于matlab数字图像处理的指纹识别系统【源码68期】
开发语言·matlab
新时代牛马7 小时前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Bs_MoneyMagnet7 小时前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
matlab代码7 小时前
基于matlab的水果识别系统(苹果香蕉菠萝梨桃子)【源码65期】
开发语言·matlab
wuyk5558 小时前
从零吃透 MQTT 通信|第 8 章 FreeRTOS 多任务架构下 MQTT 工程架构,任务拆分、队列解耦、临界区保护
c语言·开发语言·stm32·学习·架构
weixin199701080168 小时前
[特殊字符]《跨境二手ERP对接Back Market:标准化API + 7~10工作日技术合规审核实录》(附Python源码)
开发语言·python·pandas