Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Порядок вызова деструкторов 
:(
    Опции темы
Djuffin
Дата 11.8.2005, 04:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

Репутация: 1
Всего: 2



На толкнулся на элементарный пример не совсем правильного (на мой взгляд) порядка вызова деструкторов. Ключевое слово explicit не поставлено нарочно. Предположим, что по логике его там быть не должно.

По моему то, что деструктор (а перед этим конструктор) вызывается 2 раза подряд не нормально. Где я туплю???
Пробовал на bcc 5.6.4, cl 13.10, gcc 2.95


Вот программа.
Код

#include <stdlib.h>
#include <stdio.h>

class A
{

  int value;
  public:
  A(A &a)
  {
    value =  a.value;
    printf("copy constructor value = %d\n", value);
  }

  A()
  {
    value = 0;
    printf("constructor no params\n");
  }
         
  A(int i) /* no explicit */
  {
    value = i;
    printf("constructor %d\n", i);
  }

  ~A()
  {
    printf("destructor value = %d\n", value);
  }
};


int main()
  {
    A a;
    a = 1;
    a = 2;
    return 0;
  }


Вот ее вывод.
Код

constructor no params
constructor 1
destructor value = 1
constructor 2
destructor value = 2
destructor value = 2

PM MAIL   Вверх
Earnest
Дата 11.8.2005, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Все правильно: все вызовы деструктора, кроме последнего, разрушают временные объекты.
Строка a=1 вызывает конструктор A(int), чтобы создать временный объект, который затем копируется в a (оператором присваивания!). Затем временный объект разрушается. Потом все то же самое для строки a=2. И, наконец, при выходе из функции, разрушается сам объект a.
Видимо, ты путаешь две вещи:
Код

A a = 1;   
Это инициализация, здесь вызывается конструктор A(i), то же самое как если бы ты написал
Код

A a(1);

А вот здесь:
Код

A a;
a = 1;

копирование происходит с помощью оператора "=", с предварительным созданием, а затем удалением временного объекта. Если ты сделаешь конструктор A(int) explicit, то такой код не скомпилируется - разве что определить оператор =(int).


--------------------
...
PM   Вверх
Djuffin
Дата 11.8.2005, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 18.3.2005

Репутация: 1
Всего: 2



Понял. Спасибо.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0423 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.