深入解析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

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

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

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

相关推荐
市场部需要一个软件开发岗位1 分钟前
JAVA开发常见安全问题:Cookie 中明文存储用户名、密码
android·java·安全
忆~遂愿5 分钟前
GE 引擎进阶:依赖图的原子性管理与异构算子协作调度
java·开发语言·人工智能
沐知全栈开发10 分钟前
API 类别 - 交互
开发语言
MZ_ZXD00110 分钟前
springboot旅游信息管理系统-计算机毕业设计源码21675
java·c++·vue.js·spring boot·python·django·php
PP东12 分钟前
Flowable学习(二)——Flowable概念学习
java·后端·学习·flowable
ManThink Technology17 分钟前
如何使用EBHelper 简化EdgeBus的代码编写?
java·前端·网络
invicinble22 分钟前
springboot的核心实现机制原理
java·spring boot·后端
人道领域30 分钟前
SSM框架从入门到入土(AOP面向切面编程)
java·开发语言
铅笔侠_小龙虾31 分钟前
Flutter 实战: 计算器
开发语言·javascript·flutter
2的n次方_1 小时前
Runtime 执行提交机制:NPU 硬件队列的管理与任务原子化下发
c语言·开发语言