为数组中的每个对象调用析构函数

Destructor called for each object in an array

本文关键字:对象 调用 析构函数 数组      更新时间:2023-10-16

我有一个对象数组:

Square sq[81];

我认为它使用默认构造函数来创建每个。

当我通过一个for循环来初始化每个对象时,它会调用数组中每个Square对象的析构函数。

for (int k=0; k<9; k++) {
   for(int j=0; j<9; j++) {
      sq[count++] = Square(k, j);
   }
}

调用Square(k, j)时,是否删除了sq[]中的对象并创建了一个新的对象?

sq[count++] = Square(k, j);

当调用Square(k, j)时,它是否删除了sq[]中的对象并创建了一个新对象?

Square(k, j)创建一个新的临时对象,=将其复制到旧对象中。当不再需要临时对象时,它将被销毁,并且超出作用域。


顺便说一句,你实际上并没有在循环中初始化任何东西(我的意思是,除了临时的东西);你只是在事后分配。

sq[]的元素没有被破坏。相反,您可以调用每个元素的赋值操作符,为其赋值新值Square(k, j),并且在赋值结束时销毁临时对象。

如果你想避免冗余的默认构造和赋值,你可以/应该使用vector:

std::vector<Square> sq;
sq.reserve(81);
for (...) for (...) sq.push_back(Square(k,j));

如果您想进一步避免冗余的临时,请使用c++ 11并写入

for (...) for (...) sq.emplace_back(k, j);

让我们以以下示例程序为例:http://codepad.org/S1iH4cWD

您可以看到几个重要的步骤:

  • main之前,Square sq[81]中的每个对象都是默认构造的。
  • 在你的循环中,一个临时对象被构造,它的内容被赋值给sq中的一个对象——它覆盖了那里的内容——然后这个临时对象被销毁。
  • 最后,在main之后,Square sq[81]中的每个对象都按照构造的相反顺序被销毁。

所以你几乎是对的,除了sq中的对象只会在main结束后被删除。被销毁的是临时对象(=右边的对象)。

你可能会发现这个程序很有用:http://codepad.org/JPE8uYVO它跟踪初始化和赋值的不同值。