#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;
}
Run Code Online (Sandbox Code Playgroud)
该程序将输出:
constructor:1 destructor:0 destructor:-1 destructor:-2
构造函数和析构函数不成对出现?
jua*_*nza 14
您需要添加一个增加计数器的复制构造函数.
A(const A&)
{
++cnt;
cout<<"copy constructor:"<<cnt<<endl;
}
Run Code Online (Sandbox Code Playgroud)
如果不显式添加它,编译器将生成一个不对计数器执行任何操作的程序cnt.
这个表达
A a1 = f(a0);
Run Code Online (Sandbox Code Playgroud)
正在创建a0使用复制构造函数的副本.确切的份数可能因复制省略而异,但您cnt应该0在程序的最后.
注意:在C++ 11中,您还应该考虑编译器生成的移动复制构造函数的可能性,但是,一旦声明了自己的复制构造函数,编译器就不再生成移动版本.
| 归档时间: |
|
| 查看次数: |
661 次 |
| 最近记录: |