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

时间:2011-09-20 13:05:11

标签: c++ arrays destructor

我有一个对象数组:

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[]中的对象并创建新对象?

3 个答案:

答案 0 :(得分:7)

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

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

没有。

Square(k, j)创建一个新的临时对象,=将其复制到旧对象中。然后销毁临时对象,因为它不再需要并超出范围。


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

答案 1 :(得分:3)

sq[]的元素不会被破坏。而是调用每个元素的赋值运算符为其赋值新值Square(k, j),并在赋值结束时销毁临时对象。

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

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

如果您还想避免冗余临时,请使用C ++ 11并说出

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

答案 2 :(得分:0)

我们采取以下示例程序:http://codepad.org/S1iH4cWD

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

  • main之前,Square sq[81]中的每个对象都是默认构建的。
  • 在你的循环中,构造一个临时文件,其内容被分配给sq中的一个对象 - 它会覆盖那里的内容 - 然后临时被破坏。
  • 最后,在main之后,Square sq[81]中的每个对象都被破坏,与构造的顺序相反。

所以你几乎没有,除了只有main结束后才能删除sq中的对象。它是被破坏的临时(=右侧的对象)。

您可能会发现此计划有用:http://codepad.org/JPE8uYVO 它跟踪初始化与分配的不同值。