#include<iostream>
using namespace std;
class A{
public:
static int cnt;
A()
{
++cnt;
cout<<"constructor:"<<cnt<<endl;
}
~A()
{
--cnt;
cout<<"destructor:"<<cnt<<endl;
}
};
int A::cnt = 0;
A f(A x){
return x;
}
int main(){
A a0;
A a1 = f(a0);
return 0;
}
程序将输出:
constructor:1 destructor:0 destructor:-1 destructor:-2
构造函数和析构函数不成对出现?
答案 0 :(得分:14)
您需要添加一个增加计数器的复制构造函数。
A(const A&)
{
++cnt;
cout<<"copy constructor:"<<cnt<<endl;
}
如果不明确添加,编译器会生成一个对计数器cnt
不起作用的编译器。
此表达式
A a1 = f(a0);
正在创建a0
的副本,它们使用了复制构造函数。确切的份数可能会因copy elision而异,但您的cnt
应该在计划结束时为0
。
注意:在C ++ 11中,您还应该考虑编译器生成移动复制构造函数的可能性,但是,一旦声明了自己的复制构造函数,编译器不再生成移动版本。
答案 1 :(得分:5)
您没有跟踪所有构造函数,只跟踪默认构造函数。编译器生成了一个复制构造函数并使用了它几次,考虑了被列为已销毁但未创建的2个对象。
答案 2 :(得分:3)
您还需要计算复制构造函数调用。在C ++ 11中,还需要考虑移动构造函数。