Дикий прикол с классами
Его конструктор вызывает свой же деструктор. Прикольно , да? Я сначала подумал
что С++ меня вообще пошлёт подальше , но всё работает.
//начало 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 сам
его при первом же использовании класса запускает,
но всё таки...)
Я вот что сделал:
void main(void)
{
Kill.Init();
cout << " ----------- "<< "\n";
}
И результат:
You be DEAD!!!
-----------
You be DEAD!!!
Но всё равно - что класс 2 раза дохнет?!?
А если б там память резервировалась(теоретически)
в конструкторе,а в деструкторе чистилась ,
то при 2 -м вызове деструктора - каюк!!!
У кого какие мысли умные - просветите!!!
Похоже все деструкторы в конце проги запускаются.
М-да... Я бы посоветовал книжки почитать для начала. Страуструпа, например. Разобраться со временем жизни объектов.
Да ! А можно самому запустить конструктор самому
как-нить??? (Вроде слышал что нет - CPP сам
его при первом же использовании класса запускает,
но всё таки...)
Знания С++ нулевые!
М-да... Я бы посоветовал книжки почитать для начала. Страуструпа, например. Разобраться со временем жизни объектов.
Знания С++ нулевые!
М-да.Действительно нулевые. Займусь чтением Страуструпа.
То в конструкторе ты вызываешь деструктор не того объекта который ты только что создал, то есть только в конце программы вызывается деструктор объекта Kill.
По поводу жизни объекта(из Страуструпа)
"
Если только программист не вмешается явно, объект будет создан при
появлении его определения и уничтожен, когда исчезнет из
области видимости. Объекты с глобальными именами создаются,
инициализируются (причем только один раз) и существуют до конца
программы. "
Ага!
По поводу жизни объекта(из Страуструпа)
"
Если только программист не вмешается явно, объект будет создан при
появлении его определения и уничтожен, когда исчезнет из
области видимости. Объекты с глобальными именами создаются,
инициализируются (причем только один раз) и существуют до конца
программы. "
Дело не во времени жизни объекта. Просто когда вызывается деструктор по его имени, то есть идет вызов ОБЫЧНОЙ функции-члена класса, выполняется лишь ТЕЛО деструктора; сам объект при этом не уничтожается. Тело деструктора выполняется автоматически при уничтожении объекта. Поэтому в твоем случае два раза строчка выводится. Первый раз - потому что в конструкторе ты вызываешь деструктор сам, а в конце - потому что объект уничтожается автоматически при выходе из main.
Да ! А можно самому запустить конструктор самому
как-нить??? (Вроде слышал что нет - CPP сам
его при первом же использовании класса запускает,
но всё таки...)
Можно и конструктор вручную запустить (наприменр при написании собственного new ).
А насчет вызова деструктора - язык располагает средством для автоматического уничтожения пр ПРАВИЛЬНОМ использовании синтакса и правил языка. Деструктор это обычная функция просто к ней применяются определенные правила (например вызов при умирании объекта). Язык призван для облегчения труда и явно не для защиты от ошибок сделанных намеренно.
Спасибо! Внесли ясность!