对象计数器

题目描述

补全 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();
}