C :尝试了解向量和类

c++: try to understand vector and class

本文关键字:向量 了解      更新时间:2023-10-16

我对以下代码感到困惑。

#include <iostream>
#include <vector>
using namespace std;
class A
{
 public:
  A(int _a) : a(_a)
  {
    cout << "A(" << a << ") created" << endl;
  }
  ~A()
  {
    cout << "A(" << a << ") deleted" << endl;
  }
  int a;
};
void test()
{
  vector<A> as;
  A a1(1);
  A a2(2);
  as.push_back(a1);
  as.push_back(a2);
  cout << "test ended" << endl;
}
int main()
{
  test();
  return 0;
}

这是输出。

A(1) created
A(2) created
A(1) deleted  <== ?
test ended
A(2) deleted
A(1) deleted
A(1) deleted
A(2) deleted

为什么有额外的" a(1)删除"?

我知道执行push_back时存在隐式复制构造。但是,我的问题是为什么A1对A2的处理方式不同?

  • 用对象A1调用第一个vector#push_back时,它会创建一个使用复制构造函数的对象A1的副本。

  • 使用对象A2调用第二个向量#push_back时,它必须用两个对象重新创建向量。因此,它删除已复制的A1对象,创建另一个向量并添加A1和A2的新副本。这就是为什么您会看到A1的第一个删除语句。

  • 最后,当您的程序退出时,删除了A1和A2的副本,这就是为什么您会看到每个A1和A2的两个删除语句。

如果创建具有2个元素的初始大小的向量,则会看到为A1和A2创建的对象数量相等。只是做

as.reserve(2);

创建两个对象的向量,以便在按下第二个对象时不必重新创建向量。

另外,如果您定义了自己的复制构造函数,则可以看到何时确切的vector#push_back创建对象的副本:

  A(const A &obj) {
      a = obj.a;
      cout << "A(" << a << ") created in copy constructor" << endl;          
  }