C++类及其派生类对象计数的实现方法

步骤:

  1. 为类设计一个 static 静态变量 count 作为计数器。
  2. 类定义结束后,初始化 count
  3. 在构造函数中对 count 进行 +1 操作。
  4. 设计拷贝构造函数,在拷贝构造函数中对 count 进行 +1 操作。
  5. 设计复制构造函数(即赋值运算符),在执行赋值操作时对 count 进行 +1 操作。
  6. 在析构函数中对 count 进行 -1 操作。

代码示例及注释:

#include <iostream>

// 基类,用于计数子类数量
class Base {
public:
    // 静态计数器,用于记录当前类及其派生类的实例数量
    static int count;

    // 默认构造函数
    Base() {
        ++count; // 每当创建一个新对象,计数器增1
    }

    // 拷贝构造函数
    Base(const Base& other) {
        ++count; // 每当使用拷贝构造函数创建一个新对象,计数器增1
    }

    // 赋值运算符
    Base& operator=(const Base& other) {
        // 注意:赋值运算符通常不会创建新对象,所以这里不操作计数器
        // 不过若另作为练习或题意需求,可以考虑适当添加逻辑,使表计数逻辑更加符合题意
        return *this;
    }

    // 析构函数
    virtual ~Base() {
        --count; // 每当销毁一个对象,计数器减1
    }
};

// 初始化静态变量
int Base::count = 0;

// 派生类
class Derived : public Base {
public:
    // 默认构造函数
    Derived() : Base() {}

    // 拷贝构造函数
    Derived(const Derived& other) : Base(other) {}

    // 赋值运算符
    Derived& operator=(const Derived& other) {
        if (this != &other) {
            Base::operator=(other); // 调用基类的赋值运算符
        }
        return *this;
    }

    // 析构函数
    ~Derived() {}
};

int main() {
    Derived d1;
    std::cout << "Count after creating d1: " << Base::count << std::endl;

    Derived d2(d1);
    std::cout << "Count after copy-constructing d2 from d1: " << Base::count << std::endl;

    Derived d3;
    d3 = d2; // 这里赋值操作不会改变计数器
    std::cout << "Count after assigning d3 from d2: " << Base::count << std::endl;

    // 销毁d1
    {
        Derived d4;
        std::cout << "Count with block created d4: " << Base::count << std::endl;
    }
    std::cout << "Count after d4 is out of scope: " << Base::count << std::endl;

    return 0;
}

注释:

  1. 静态计数器 count

    • 在基类 Base 中定义了一个静态变量 count,用于计数当前类及其派生类的实例数量。
    • 静态变量在类定义结束后进行初始化。
  2. 构造函数

    • 每当创建一个新的 Base 或 Derived 对象时,构造函数被调用,count 递增。
  3. 拷贝构造函数

    • 每当使用拷贝构造函数创建一个新的对象时,count 递增。
  4. 赋值运算符

    • 一般情况下,赋值操作不会创建新的对象,因此在这个示例中赋值操作并不会改变count的值。
    • 若确实需要使同一个对象实例管理的2对象实例计数匹配题意,您可以考虑细化构造逻辑。
  5. 析构函数

    • 每当对象被销毁时,析构函数被调用,count 递减。

通过这种方法,可以非常直观地统计出当前类及其派生类实例的数量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值