题目

编写程序,设计具有生命周期自动计数的类 Session。演示 static 静态成员变量脱离具体对象实例、由该类的所有实例全局共享的内存特性;掌握静态成员变量必须在类外单独进行全局定义的编译链接规则(避免重复定义);并使用 static 静态成员函数管理与查询活跃实例数,解释静态成员函数内部不存在 this 指针从而无法直接访问普通非静态成员的底层原因。

输入格式:无需外部输入。

输出格式:输出对象构造与作用域跳出析构时活跃实例计数器的动态增减变化。

数据范围与约定:类静态成员内存布局、全局数据段存储与访问权限。

思路与算法

1. 内存存储位置
静态成员变量不占用类实例对象的 sizeof 空间,它被分配在进程的全局/静态数据段(BSS 或 Data 段)中,生命周期从程序启动延续到进程结束。

2. 类外唯一定义
在类内声明 static int count; 仅仅是符号声明;必须在 .cpp 文件或类外全局写 int Session::count = 0; 触发实际物理内存分配(C++17 引入 inline static 可在类内直接就地初始化)。

3. 没有 this 指针
普通成员函数由编译器暗中传递一个隐式的 this 指针作为第一个实参;而 static 成员函数是普通的全局函数加上了类域修饰,不传 this 指针,因此它不能调用非 static 成员。

完整程序

#include <iostream>
#include <string>

class Session {
private:
    int sessionId_;
    std::string user_;

    // 静态成员变量声明:所有实例共享一个计数器
    static int activeCount_;
    static int totalCreated_;

public:
    Session(int id, std::string user) : sessionId_(id), user_(std::move(user)) {
        ++activeCount_;
        ++totalCreated_;
        std::cout << "  [上线] 会话 #" << sessionId_ << " 用户: " << user_ 
                  << " (当前在线: " << activeCount_ << ")\n";
    }

    ~Session() {
        --activeCount_;
        std::cout << "  [下线] 会话 #" << sessionId_ << " 销毁 (当前在线: " << activeCount_ << ")\n";
    }

    // 静态成员函数:无 this 指针,只能访问 static 成员
    static int getActiveCount() {
        return activeCount_;
    }

    static int getTotalCreated() {
        return totalCreated_;
    }
};

// 规范:类外分配物理内存并赋初值
int Session::activeCount_ = 0;
int Session::totalCreated_ = 0;

int main() {
    std::cout << "初始状态在线会话数: " << Session::getActiveCount() << "\n\n";

    Session s1(101, "Alice");
    {
        std::cout << "\n--- 进入局部作用域 ---\n";
        Session s2(102, "Bob");
        Session s3(103, "Charlie");
        std::cout << "局部块内当前在线: " << Session::getActiveCount() << "\n";
    } // s2, s3 在此析构

    std::cout << "\n--- 离开局部作用域后 ---\n";
    std::cout << "当前存活会话数: " << Session::getActiveCount() << "\n";
    std::cout << "历史累计创建总会话数: " << Session::getTotalCreated() << "\n";

    return 0;
}

运行示例

输出:

初始状态在线会话数: 0

  [上线] 会话 #101 用户: Alice (当前在线: 1)

--- 进入局部作用域 ---
  [上线] 会话 #102 用户: Bob (当前在线: 2)
  [上线] 会话 #103 用户: Charlie (当前在线: 3)
局部块内当前在线: 3
  [下线] 会话 #103 销毁 (当前在线: 2)
  [下线] 会话 #102 销毁 (当前在线: 1)

--- 离开局部作用域后 ---
当前存活会话数: 1
历史累计创建总会话数: 3