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

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

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

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

相关推荐
思麟呀9 分钟前
C++17(三)if constexpr+折叠表达式
开发语言·c++
醉城夜风~9 分钟前
Java详解经典算法题:接雨水(三种实现方案+原理剖析)
java·开发语言·算法
qydz1119 分钟前
杰理开发基础知识(3)
开发语言·嵌入式开发·杰理科技
贾斯汀frank20 分钟前
C# 15 类型系统改进:Union Types
开发语言·windows·c#
阿里嘎多学长31 分钟前
2026-07-10 GitHub 热点项目精选
开发语言·程序员·github·代码托管
CHHH_HHH1 小时前
【C++11】深入解析C++可变参数模板
开发语言·c++·算法·stl·c++11
数智化转型推荐官1 小时前
2026统一身份管理系统五大发展趋势解读
java·运维·微服务
看菜鸡互1 小时前
探索用 SlideML 让大模型生成 PPT 的实验方法
java·运维
jimy13 小时前
C语言模拟对象、方法:“函数指针+结构体“复用函数指针指向的函数体
c语言·开发语言
程序员张33 小时前
SpringBoot集成BCrypt密码加密库
java·spring boot·后端