【发布时间】:2022-11-16 09:05:25
【问题描述】:
我的任务是创建一个 C 类,它会自动跟踪其存在的实例数,并提供一个返回该数字的函数。
这是我所拥有的:
class C{
public:
static int num;
C(){++num;}
~C(){--num;}
int get_number_objs(){return num;}
};
int C::num = 0;
这能解决问题吗?
这看起来很简单并且可能有道理,但我想知道是否存在边缘情况,您会乱用指针或类似的东西,让某些东西从裂缝中掉下来。
这是解决方案的验证,比什么都重要。
【问题讨论】:
-
用
C c; C d = c; std::cout << d.get_number_objs();测试它。或者换个角度看:你显然违反了rule-of-three,所以可能有问题。 -
所以我还需要重载复制构造函数和复制赋值构造函数,对吗?
-
以及在必要时移动构造函数和移动赋值运算符。虽然我相信在大多数情况下您可以默认赋值运算符。他们不会增加或减少计数。
-
@RedRubber 只有复制构造函数(和移动构造函数)。赋值运算符只是将成员数据从现有实例复制/移动到另一个现有实例,它不会创建新实例,只有构造函数会这样做。