当 push_back 为向量时,是否需要复制构造函数来修改静态成员?
Do I need a copy constructor to modify static member when push_back into a vector?
想象一下 class:
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.
我的猜测是我创建了对象,然后将其复制到 vector 中,然后对象被销毁了。
除了创建复制构造函数,我还有其他选择吗?
计数器应与您的程序在任何给定时间拥有的对象数相匹配。每次破坏都会减少对象的数量,这就是为什么有 --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
- 创建一个测试对象 (++0 = 1)
- 向量复制对先前对象的引用
- vector 删除它创建的对象 (--1 = 0)
- 打印计数器
- 原始对象已删除
想象一下 class:
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.
我的猜测是我创建了对象,然后将其复制到 vector 中,然后对象被销毁了。
除了创建复制构造函数,我还有其他选择吗?
计数器应与您的程序在任何给定时间拥有的对象数相匹配。每次破坏都会减少对象的数量,这就是为什么有 --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
- 创建一个测试对象 (++0 = 1)
- 向量复制对先前对象的引用
- vector 删除它创建的对象 (--1 = 0)
- 打印计数器
- 原始对象已删除