首页 > 解决方案 > 了解将对象插入向量时的构造、复制和销毁

问题描述

我试图了解 STL 如何处理对象的插入。我知道 STL 从临时调用构造函数或复制构造。

这是我试图理解的代码:

#include <iostream>
#include <string>
#include <vector>
using namespace std;

class A
{
      public:
      int ObjId;;
      A(int id) : ObjId(id)
      {
            cout << "Constructing object with id: " << ObjId << endl;
      }

      A(const A& objToCpy)
      {
            ObjId = objToCpy.ObjId;
            cout << "Copying object with id: " << ObjId << endl;
       }

      ~A()
      {
            cout << "Destructing object with id: " << ObjId << endl;
      }
};


int main()
{
      std::vector<A> vecOfA;

      vecOfA.push_back(A(1));

      cout << "....................." << endl << endl;

      vecOfA.push_back(A(2));

      return 0;
}

这给出了以下输出:

构造具有 id: 1 的对象

复制具有 id: 1 的对象

使用 id 破坏对象:1

......

用 id 构造对象:2

复制具有 id: 2 的对象

复制具有 id: 1 的对象

使用 id 破坏对象:1

使用 id 破坏对象:2

......

使用 id 破坏对象:1

使用 id 破坏对象:2

我可以理解第一个插入。创建一个 ID=1 的临时对象,然后将其复制构造并插入到向量中。然后这个临时的就被破坏了。

但是,我不明白为什么复制的对象的 ID=0,而不是 1。

至于第二部分,我不知道发生了什么以及为什么它与第一次插入不同,唯一的例外是 ID 不同。为什么要复制 2 个对象,并且它们的 ID=0,而不是 2。

谁能帮我理解这种行为?

标签: c++vectorconstructorstlcopy-constructor

解决方案


在第一种情况下,您让ObjId未初始化,这意味着您很幸运插入了 0,但基本上也可以有任何可见的值。

通过键入A(const A& other) {...},您定义了自己的复制构造函数,这意味着您显示了每个字段是如何复制的,因此您错过ObjId = other.ObjId了构造函数中的语句。

发生第二种情况是因为您的向量正在调整大小,因此它必须将所有元素从旧存储复制到新的更大的存储,该存储也将适合新元素。


推荐阅读