C ++中类析构函数的奇怪行为

Xeenych Xeenych
#include <iostream>
using namespace std;

class CCC {
public:
    CCC() {cout<<"created "<<++count<<endl;}
    ~CCC(){cout<<"deleted "<<--count<<endl;}
    int count=0;
};

CCC a;

CCC& create() { 
    return a; 
}

int main () {
    CCC result = create();
}

https://godbolt.org/z/K3eR9t

上面的代码产生奇怪的输出。看起来析构函数被调用了2次,但计数没有减少。这是为什么?

created 1
deleted 0
deleted 0
布赖恩

count成员是非静态的,因此的每个实例CCC都有其自己的副本。

对于instance acount当默认构造函数启动时,该成员将设置为0,然后递增为1并打印。以后它将被销毁,该count成员递减为0,然后再次打印。

对于实例result,该count成员由复制构造函数设置为1,因为它是1 in a当销毁它时,该成员递减为0并再次打印。

如果您想跟踪存在的类的实例总数,则需要一个静态成员,

static int count = 0;

此外,您不仅需要在默认构造函数中,而且还需要在复制和移动构造函数中对其进行递增。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章