想象一下以下课程:
class test
{
private:
static int counter;
//some stuff
public:
test() {++counter;};
~test() {--counter;};
};
我的问题如下:如果我把push_back
变成一个向量:
std::vector<test> tests;
tests.push_back(test());
在这一点上,我希望我的计数器标记1
,因为我总共创建了1个元素。问题是它标记为0。
我的猜测是我创建了对象,然后将其复制到向量中,然后对象被破坏。
除了创建复制构造函数之外,我还有其他选择吗?
计数器应该与您的程序在任何给定时间具有的对象数相匹配。每次破坏都会减少物体的数量,这就是为什么有一个--counter
。此外,每个构造函数创建一个对象,增加对象的总数,因此每个构造函数都应该有一个++counter
。
复制构造函数(默认或不默认)创建一个新对象。很明显,你必须确保复制构造函数有一个++counter
。为此,您必须实现一个复制构造函数。
如果您没有定义此复制构造函数,则push_back
会运行复制构造函数,从而创建一个新对象。但是使用默认的复制构造函数,计数器保持不变。最终传递给push_back
的临时值被删除,尽管向量中有一个对象,计数器仍然变为0
。
我对你的代码做了一些小技巧
class test
{
private:
static int counter;
//some stuff
public:
test() {
++counter;
cout<<"constructor "<<endl;
}
~test() {
--counter;
cout<<"Destructors"<<endl;
}
};
int test::counter = 0;
int main(void)
{
std::vector<test> tests;
tests.push_back(test());
cout<<tests[0].counter<<endl;
return 0;
}
输出:
constructor
Destructors
0
Destructors