Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2011, 16:20   #1
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
По умолчанию Объекты классов, деструкторы, конструкторы

Не совсем понимаю... поправьте, если, что...
Думается мне, что:
объект к-н-дь класса можно создать статически (определить до момента компиляции),
а если так?:
main()
{
classA ObjectA;
}
то объект будет локальным? Или как он создастся?

А через операторы new создают?

Не понимаю ещё работу деструктора. Что считается уничтожением объекта? Из моих примеров как уничтожается объект определяемый как classA ObjectA?
Создавая через new можно удалять через delete (это понятно). А деструктор - это уничтожение объектов и прочего созданный объектом класса? Деструктором удаляется не сам ВЕДЬ объект класса???
Надеюсь понятно спросил? Ответьте мне пожалуйста подробнее.
GerNick вне форума Ответить с цитированием
Старый 11.03.2011, 16:37   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
то объект будет локальным?
да, память будет выделена в стеке, и в случае ошибки утечки не произойдет.(как в случае с new)
Цитата:
Из моих примеров как уничтожается объект определяемый как classA ObjectA?
когда произойдет выход из исполняемого блока с вашим объектом(это если стековый как в примере)
Цитата:
Создавая через new можно удалять через delete (это понятно).
нужно удалять!
Цитата:
Деструктором удаляется не сам ВЕДЬ объект класса???
именно объект и удаляется.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2011, 16:45   #3
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Для глобальных объектов конструктор объекта вызывается тогда, когда начинается выполнение программы. Для локальных объектов конструктор вызывается всякий раз при выполнении инструкции объявления переменной.
Функцией, обратной конструктору, является деструктор. Эта функция вызывается при удалении объекта. Обычно при работе с объектом в момент его удаления должны выполняться некоторые действия. Например, при создании объекта для него выделяется память, которую необходимо освободить при его удалении.
Деструктор класса вызывается при удалении объекта. Локальные объекты удаляются тогда, когда они выходят из области видимости. Глобальные объекты удаляются при завершении программы. Адреса конструктора и деструктора получить невозможно.
(с) Герберт Шилдт
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 11.03.2011, 16:49   #4
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
По умолчанию

Спасибо за ответ.
Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
да, память будет выделена в стеке, и в случае ошибки утечки не произойдет.(как в случае с new)
когда произойдет выход из исполняемого блока с вашим объектом(это если стековый как в примере)нужно удалять!
именно объект и удаляется.
Т.е. если деструктор пустой, то объект не будет удален?
Тогда всё вышесказанное понял кроме ДЕСТРУКТОРА. Если в одном случае объект перестаёт существовать при завершении процедуры, в другом по оператору delete. Таким образом если не определён деструктор, то произойдёт удечка памяти? А при создании через new зачем нужен delete если сделать деструктор внешним вызываемым (или как там называется). Пока не совсем понял.
GerNick вне форума Ответить с цитированием
Старый 11.03.2011, 16:57   #5
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

При использовании оператора delete для указателя на объект вызывается деструктор соответствующего класса.
Так понятнее?
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 11.03.2011, 17:01   #6
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
При использовании оператора delete для указателя на объект вызывается деструктор соответствующего класса.
Так понятнее?
Понятно, спасибо.
Кажися разобрался. Теперь нужно разобраться как написать деструктор:
определить размер класса и идентификатор объекта (что-то вроде этого)???
GerNick вне форума Ответить с цитированием
Старый 11.03.2011, 17:04   #7
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

main() нельзя, пишитн int main().
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 11.03.2011, 17:07   #8
GerNick
Пользователь
 
Регистрация: 20.12.2010
Сообщений: 14
По умолчанию

Цитата:
Сообщение от Obey-Kun Посмотреть сообщение
main() нельзя, пишитн int main().
спасибо!!! торопился... упустил
GerNick вне форума Ответить с цитированием
Старый 11.03.2011, 17:10   #9
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

деструктор вызывается до выполнения оператора класса delete.
он должен подготовить обьект к уничтожению.
а освобождает память operator delete.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.03.2011, 17:12   #10
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Отвечаю на твой вопрос. Твой объект удаляется, когда выходит за scope (то есть доходит до "}") в случае обычного создания или когда ты делаешь delete в случае динамического создания. Деструктор нужно писать если тебе нужно помимо удаления объекта сделать ещё что-то (например, освободить динамически выделенную память под его поля).
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
КЛАССЫ. КОНСТРУКТОРЫ. ДЕСТРУКТОРЫ. LeNus'Ka Помощь студентам 4 24.11.2010 17:11
Конструкторы и деструкторы @arkadii Общие вопросы C/C++ 2 10.11.2010 17:40
С++ и С# Конструкторы и Деструкторы exKenny Помощь студентам 1 27.04.2010 12:32
Классы. Конструкторы и деструкторы. Freddy_Krueger Помощь студентам 1 29.11.2009 13:12