C ++:尝试了解向量和类

时间:2019-02-28 20:28:22

标签: c++

我对以下代码感到困惑。

#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区别对待?

1 个答案:

答案 0 :(得分:0)

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

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

  • 最后,当程序退出时,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;          
  }