当push_back进入向量时,是否需要复制构造函数来修改静态成员?

问题描述 投票:-2回答:2

想象一下以下课程:

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。

我的猜测是我创建了对象,然后将其复制到向量中,然后对象被破坏。

除了创建复制构造函数之外,我还有其他选择吗?

c++ constructor copy-constructor
2个回答
0
投票

计数器应该与您的程序在任何给定时间具有的对象数相匹配。每次破坏都会减少物体的数量,这就是为什么有一个--counter。此外,每个构造函数创建一个对象,增加对象的总数,因此每个构造函数都应该有一个++counter

复制构造函数(默认或不默认)创建一个新对象。很明显,你必须确保复制构造函数有一个++counter。为此,您必须实现一个复制构造函数。

如果您没有定义此复制构造函数,则push_back会运行复制构造函数,从而创建一个新对象。但是使用默认的复制构造函数,计数器保持不变。最终传递给push_back的临时值被删除,尽管向量中有一个对象,计数器仍然变为0


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. vector复制对先前对象的引用
  3. vector删除它创建的对象( - 1 = 0)
  4. 打印柜台
  5. 原始对象已删除

这叫Shallow Copy Constructor

© www.soinside.com 2019 - 2024. All rights reserved.