Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дикий прикол с классами

724
10 июля 2003 года
_anton
100 / / 04.11.2002
Мне было нечего делать! Я взял и сделал класс.
Его конструктор вызывает свой же деструктор. Прикольно , да? Я сначала подумал
что С++ меня вообще пошлёт подальше , но всё работает.

//начало main.h
class SelfDestructor
{
public:
SelfDestructor(void);
~SelfDestructor(void);
void Init(void);
};

SelfDestructor Kill;
//конец main.h

//начало main.cpp
#include <iostream.h>
#include "main.h"

SelfDestructor::SelfDestructor(void)
{
SelfDestructor::~SelfDestructor();
}

SelfDestructor::~SelfDestructor(void)
{
cout << "You be DEAD!!!" << "\n";
}

void SelfDestructor::Init(void)
{ // запуск конструктора
}
//основная функция
void main(void)
{
Kill.Init();
}
//конец main.cpp

Итак Init - всего-лишь чтобы конструктор запустился.
И самый прикол!!!
You be DEAD!!!
You be DEAD!!!
2 раза!!!!!!!!!!! ну почему 2 раза-то???
Кто-нить может мне объяснить почему!!!
Может в конце проги все деструкторы
автоматически запускаются???

Да ! А можно самому запустить конструктор самому
как-нить??? (Вроде слышал что нет - CPP сам
его при первом же использовании класса запускает,
но всё таки...)
724
10 июля 2003 года
_anton
100 / / 04.11.2002
Похоже все деструкторы в конце проги запускаются.
Я вот что сделал:

void main(void)
{

Kill.Init();
cout << " ----------- "<< "\n";
}
И результат:
You be DEAD!!!
-----------
You be DEAD!!!

Но всё равно - что класс 2 раза дохнет?!?
А если б там память резервировалась(теоретически)
в конструкторе,а в деструкторе чистилась ,
то при 2 -м вызове деструктора - каюк!!!

У кого какие мысли умные - просветите!!!
3
10 июля 2003 года
Green
4.8K / / 20.01.2000
Цитата:
Originally posted by _anton
Похоже все деструкторы в конце проги запускаются.



М-да... Я бы посоветовал книжки почитать для начала. Страуструпа, например. Разобраться со временем жизни объектов.

Цитата:
Originally posted by _anton

Да ! А можно самому запустить конструктор самому
как-нить??? (Вроде слышал что нет - CPP сам
его при первом же использовании класса запускает,
но всё таки...)



Знания С++ нулевые!

724
10 июля 2003 года
_anton
100 / / 04.11.2002
Цитата:
Originally posted by Green


М-да... Я бы посоветовал книжки почитать для начала. Страуструпа, например. Разобраться со временем жизни объектов.



Знания С++ нулевые!



М-да.Действительно нулевые. Займусь чтением Страуструпа.

1.8K
11 июля 2003 года
shrize
46 / / 04.12.2002
Если я не ошибаюсь(хотя мне это свойственно)
То в конструкторе ты вызываешь деструктор не того объекта который ты только что создал, то есть только в конце программы вызывается деструктор объекта Kill.
724
11 июля 2003 года
_anton
100 / / 04.11.2002
Ага!
По поводу жизни объекта(из Страуструпа)
"
Если только программист не вмешается явно, объект будет создан при
появлении его определения и уничтожен, когда исчезнет из
области видимости. Объекты с глобальными именами создаются,
инициализируются (причем только один раз) и существуют до конца
программы. "
463
14 июля 2003 года
waterman
178 / / 17.01.2003
Цитата:
Originally posted by _anton
Ага!
По поводу жизни объекта(из Страуструпа)
"
Если только программист не вмешается явно, объект будет создан при
появлении его определения и уничтожен, когда исчезнет из
области видимости. Объекты с глобальными именами создаются,
инициализируются (причем только один раз) и существуют до конца
программы. "



Дело не во времени жизни объекта. Просто когда вызывается деструктор по его имени, то есть идет вызов ОБЫЧНОЙ функции-члена класса, выполняется лишь ТЕЛО деструктора; сам объект при этом не уничтожается. Тело деструктора выполняется автоматически при уничтожении объекта. Поэтому в твоем случае два раза строчка выводится. Первый раз - потому что в конструкторе ты вызываешь деструктор сам, а в конце - потому что объект уничтожается автоматически при выходе из main.

4.9K
14 июля 2003 года
AlexTAI
1 / / 14.07.2003
Цитата:


Да ! А можно самому запустить конструктор самому
как-нить??? (Вроде слышал что нет - CPP сам
его при первом же использовании класса запускает,
но всё таки...)



Можно и конструктор вручную запустить (наприменр при написании собственного new ).
А насчет вызова деструктора - язык располагает средством для автоматического уничтожения пр ПРАВИЛЬНОМ использовании синтакса и правил языка. Деструктор это обычная функция просто к ней применяются определенные правила (например вызов при умирании объекта). Язык призван для облегчения труда и явно не для защиты от ошибок сделанных намеренно.

724
14 июля 2003 года
_anton
100 / / 04.11.2002
2 AlexTAI & waterman
Спасибо! Внесли ясность!
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог