步骤:
- 为类设计一个
static
静态变量count
作为计数器。 - 类定义结束后,初始化
count
。 - 在构造函数中对
count
进行+1
操作。 - 设计拷贝构造函数,在拷贝构造函数中对
count
进行+1
操作。 - 设计复制构造函数(即赋值运算符),在执行赋值操作时对
count
进行+1
操作。 - 在析构函数中对
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;
}
注释:
-
静态计数器
count
:- 在基类
Base
中定义了一个静态变量count
,用于计数当前类及其派生类的实例数量。 - 静态变量在类定义结束后进行初始化。
- 在基类
-
构造函数:
- 每当创建一个新的
Base
或Derived
对象时,构造函数被调用,count
递增。
- 每当创建一个新的
-
拷贝构造函数:
- 每当使用拷贝构造函数创建一个新的对象时,
count
递增。
- 每当使用拷贝构造函数创建一个新的对象时,
-
赋值运算符:
- 一般情况下,赋值操作不会创建新的对象,因此在这个示例中赋值操作并不会改变
count
的值。 - 若确实需要使同一个对象实例管理的2对象实例计数匹配题意,您可以考虑细化构造逻辑。
- 一般情况下,赋值操作不会创建新的对象,因此在这个示例中赋值操作并不会改变
-
析构函数:
- 每当对象被销毁时,析构函数被调用,
count
递减。
- 每当对象被销毁时,析构函数被调用,
通过这种方法,可以非常直观地统计出当前类及其派生类实例的数量。