对象计数器
题目描述
补全 Foobar
类的定义,使得 Foobar::totalNum
总是等于 Foobar
类的实例的个数。
关于输入
无
关于输出
见样例输出
核心技巧
- 需要通过析构函数减少计数。
- 复制构造也需要增加计数。预置的复制构造在函数调用和/或返回时使用。
补充知识点
Foobar()
是将“没有值”转换为Foobar
类型的临时值。它是一个右值,具有短存储期,在全表达式结尾(即分号前)自动析构。
参考答案
#include <iostream>
class Foobar {
static int totalNum;
public:
Foobar() {
totalNum++;
}
Foobar(const Foobar&) {
totalNum++;
}
~Foobar() {
totalNum--;
}
//
static void printTotal() {
std::cout << totalNum << std::endl;
}
};
int Foobar::totalNum = 0;
void byRef(const Foobar& a) {
a.printTotal();
}
void byVal(Foobar a) {
a.printTotal();
}
void staticLocal() {
static Foobar a, b, c = b;
}
int main() {
Foobar(), Foobar::printTotal();
Foobar x;
x.printTotal();
Foobar* p = new Foobar[3]{};
byRef(p[1]);
byVal(p[2]);
delete[] p;
Foobar::printTotal();
staticLocal();
Foobar::printTotal();
}