С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
UACrimea
4 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 6
#1

Непонятный вызов Деструкторов при создании списка - C++

19.02.2013, 19:07. Просмотров 908. Ответов 22
Метки нет (Все метки)

Непонятный вызов Деструкторов при создании списка.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
#include <list>
#include <vector>
#include <string>
using namespace std;
 
class AAA
{
    friend ostream &operator<<(ostream &, const AAA &);
   public:
      double x;
 
      AAA(double _x)
      {
          cout << "Vizvan Konstructor\n";
          x=_x;
      }
      
      ~AAA()
      {
         cout << "Vizvan Destructor\n";
      };
};
 
ostream &operator<<(ostream &output, const AAA &aaa)
{
   output << aaa.x << ' ' << endl;
   return output;
}
 
int main()
{
   list<AAA> L;
   L.push_back(AAA(3));
   cout<<"\n";
   L.push_back(AAA(7));
   cout<<"\n";
   L.push_back(AAA(9));
   cout<<"\n";
  
   list<AAA>::iterator i;
   for(i=L.begin(); i != L.end(); ++i) 
      cout << *i; // print with overloaded operator
   
   return 0;
}
Результат работы программы:
Vizvan Konstructor
Vizvan Destructor

Vizvan Konstructor
Vizvan Destructor
Vizvan Destructor

Vizvan Konstructor
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor

3
7
9
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor

Не пойму почему деструкторы так вызываются!
Если организовать добавление объектов в список иначе, тогда понятно как вызвываются конструктор и деструкторы!

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <iostream>
#include <list>
using namespace std;
 
 
class AAA
{
   public:
      double x;
 
      AAA(double _x)
      {
          cout << "Vizvan Konstructor\n";
          x=_x;
      }
      
      ~AAA()
      {
         cout << "Vizvan Destructor\n";
      };
};
 
 
 
 
int main()
{
   list<AAA> L;
   AAA Ablob(2);
 
   Ablob.x=7;
   L.push_back(Ablob); 
 
   Ablob.x=5;
   L.push_back(Ablob);  
              
   Ablob.x=8;
   L.push_back(Ablob); 
 
   list<AAA>::iterator i;
 
   for(i=L.begin(); i != L.end(); ++i) 
       cout << (*i).x << " " << endl; 
 
   
 
   return 0;
}
Результат:
Vizvan Konstructor
7
5
8
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor
Vizvan Destructor

Конструктор вызывается один раз потому, что мы создали один объект вне списка. 4-ре Деструктора вызываются по завершению проги(1-н к созданному отдельно объекту и 3-и к объектам скопированным в список).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.02.2013, 19:07
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Непонятный вызов Деструкторов при создании списка (C++):

Вызов конструкторов/деструкторов при наследовании - C++
Объясните пожалуйста, как получается вывод на экран 2531 #include &lt;iostream&gt; class A { public: A(int n = 2) : m_i(n) {...

Отладчик и вызов деструкторов - C++
Всем привет. Как в отладчике посмотреть, были ли вызваны деструкторы локальных объектов функции?

Наследование - вызов конструкторов и деструкторов - C++
Делаю два класса - предок и потомок: class class_1_type { private: int t; public: class_1_type(int t_) { t = t_; cout &lt;&lt;...

Вызов лишних конструкторов и деструкторов в std::vector - C++
почему вызывает лишние конструкторы и вообще делает не то, что ожидаешь class S { public: int x; S() { cout &lt;&lt; &quot;cons&quot; &lt;&lt; endl; } ...

Вызов виртуального метода при создании - C++
Добрый вечер, библиотека навязала следующее поведение: - объект создан и валиден, если выделена память, вызван конструктор и...

Вызов деструкторов членов класса - C++
у меня есть класс поля которого тоже классы...при выходе из конструктора вызывается деструктор для его полей..даже для указателей...что...

22
Schizorb
510 / 462 / 16
Регистрация: 07.04.2012
Сообщений: 869
Записей в блоге: 1
Завершенные тесты: 1
20.02.2013, 11:12 #16
Цитата Сообщение от ITcrusader Посмотреть сообщение
Вопросы расширения ёмкости, мне думается - на усмотрении реализации.
Видимо, так и есть. Но суть в том, что не каждый раз по одному дополнительному элементу выделяется. На gcc получилось вдвое, а студия как-то интересно перераспределение делает
1
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 11:18 #17
Ага, ну в любом случае, целесообразно все же использовать reserve)

Кстати, по эффективному использованию STL есть потрясающая книга. Я нахожу её очень интересной.
Скотт Мейерс, Эффективное использование STL. Рекомендую
1
daslex
1287 / 531 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
20.02.2013, 11:37 #18
Емкость расширяется по закону золотого сечения. Только не самому сечению, а близкому к нему значению
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 11:53 #19
Вероятно, этот закон носит размытый характер)))

Мы только что убедились в том, что некоторые реализации делают это в соответствии со 2-м законом Ньютона Уверен, если покопаться, можно найти реализации в соответствии с законом Бойля-Мариотта и др.

Что можно сказать с уверенностью, полагаться на то, что это делается "так, а не иначе" - нельзя.
0
daslex
1287 / 531 / 109
Регистрация: 02.08.2011
Сообщений: 2,750
20.02.2013, 12:01 #20
Цитата Сообщение от ITcrusader Посмотреть сообщение
у, ты не сможешь написать аналогичный сценарий для массива, потому как он НЕ динамически-расширяем
статический массив да, он вообще не расширяем
динамический массив расширить легко.
0
ITcrusader
Эксперт С++
176 / 162 / 8
Регистрация: 12.02.2013
Сообщений: 410
20.02.2013, 12:05 #21
Цитата Сообщение от daslex Посмотреть сообщение
динамический массив расширить легко.
Заинтригован в особенности, словом "легко"
0
UACrimea
4 / 0 / 0
Регистрация: 19.02.2013
Сообщений: 6
20.02.2013, 13:41  [ТС] #22
Тема хорошо разрослась!

Добавлено через 27 минут
Нашел книгу "Скотт Мейерс - Эффективное использование STL". Там описано про vector.
Еще обсуждение контейнеров: http://www.gamedev.ru/code/articles/?id=4228
0
silent_1991
Эксперт С++
4989 / 3046 / 149
Регистрация: 11.11.2009
Сообщений: 7,028
Завершенные тесты: 1
25.02.2013, 12:51 #23
Цитата Сообщение от daslex Посмотреть сообщение
динамический массив расширить легко
Чтобы "расширить" динамический, нужно создать массив нового, большего размера, скопировать туда данные из старого массива, а память под старый очистить. Итого один new, один цикл (про STL забудем, раз уж вектор не юзаем), один delete. Чтобы расширить вектор - нужно совершить один вызов метода.
0
25.02.2013, 12:51
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.02.2013, 12:51
Привет! Вот еще темы с ответами:

ООП в C++: Вызов родительского конструктора с параметром при создании объекта дочернего класса - C++
Здравствуйте! Столкнулся с такой проблемой: если есть родительский класс с конструктором, то при создании дочернего объекта от этого...

Ошибка при создании 2-го элемента динамического списка - C++
НЕ могу понять откуда как исправить данную ошибка . Выскакивает как мне кажется при попытке динамически выделить память для указателя на...

Компилятор выдает ошибку при создании списка - C++
Доброго времени суток всем, не могу понять где ошибка создаю список list самым простым способом #include &lt;list&gt; #include...

Непонятный вызов класса в C++ - C++
Когда изучал классы в C++ на уроках было показано два примера как можно пользоватся классами в коде Например на основе трёх файлов: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
23
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.