Деструктор вызывается для каждого объекта в массиве - PullRequest
1 голос
/ 20 сентября 2011

У меня есть массив объектов:

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 ]

7 голосов
/ 20 сентября 2011
sq[count++] = Square(k, j);

Когда вызывается Square (k, j), удаляется ли объект в sq [] и создается новый?

Нет.

Square(k, j) создает новый временный объект и = копирует его в старый. Временный объект затем уничтожается, так как он больше не требуется и выходит из области видимости.


Кстати, вы на самом деле ничего не инициализируете в цикле (я имею в виду, кроме этого временного); вы просто назначаете, после-фактом.

3 голосов
/ 20 сентября 2011

Элементы 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);
0 голосов
/ 20 сентября 2011

Давайте рассмотрим следующий пример программы: http://codepad.org/S1iH4cWD

Вы можете увидеть несколько важных шагов:

  • До main каждый объект в Square sq[81] создается по умолчанию.
  • В ваших циклах создается временный объект, его содержимое присваивается объекту в sq, который перезаписывает то, что было там, а затем временный объект уничтожается.
  • Наконец, после main, каждый объект в Square sq[81] уничтожается в обратном порядке построения.

Таким образом, вы сделали это почти правильно, за исключением того, что объекты в sq будут удалены только после окончания main.Это временный объект (объект с правой стороны =), который разрушен.

Эта программа может оказаться полезной: http://codepad.org/JPE8uYVO Она отслеживает различные значения для инициализации и для назначения.

...