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

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

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

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

相关推荐
四维碎片14 分钟前
【Qt】线程池与全局信号实现异步协作
开发语言·qt·ui·visual studio
IT码农-爱吃辣条22 分钟前
Three.js 初级教程大全
开发语言·javascript·three.js
☺����1 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
猿究院--王升1 小时前
jvm三色标记
java·jvm·算法
染翰1 小时前
lua入门以及在Redis中的应用
开发语言·redis·lua
王者鳜錸1 小时前
PYTHON让繁琐的工作自动化-函数
开发语言·python·自动化
妮妮学代码1 小时前
c#:TCP服务端管理类
java·tcp/ip·c#
兔老大RabbitMQ2 小时前
git pull origin master失败
java·开发语言·git
tt5555555555552 小时前
C/C++嵌入式笔试核心考点精解
c语言·开发语言·c++
xiao助阵2 小时前
python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
开发语言·python