深入解析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 JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马1 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端
用户3721574261351 天前
Java 处理 PDF 图片:提取 PDF 中的图片,并压缩 PDF 图片体积
java
用户3721574261351 天前
Java 打印 Word 文档:从基础打印到高级设置
java
用户3521802454752 天前
当 Prompt 学会"热更新":Spring Boot × Nacos3 AI 实战
java·spring boot·ai编程
东坡白菜2 天前
破局全栈:一个前端开发的Java入门实战记录(1)
java·全栈
唐青枫2 天前
Java Tomcat 实战指南:从 Servlet 容器到 Spring Boot 部署
java
wsaaaqqq2 天前
roudan:自由选择实体、灵活操作数据、快速写入数据库的 Java 框架
java
plainGeekDev2 天前
null 判断 → Kotlin 可空类型
android·java·kotlin
糖拌西瓜皮2 天前
Java开发者视角:深入理解Node.js异步编程模型
java·后端·node.js