当 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
  1. 创建一个测试对象 (++0 = 1)
  2. 向量复制对先前对象的引用
  3. vector 删除它创建的对象 (--1 = 0)
  4. 打印计数器
  5. 原始对象已删除

来电Shallow Copy Constructor