Как работают конструктор и деструктор по умолчанию?
От: wrongman  
Дата: 26.03.11 11:59
Оценка: -1 :)
Добрый день уважаемые форумчане. Мой вопрос наверное покажется вам глупым. Но тем не менее, я нигде не смог найти на него ответа. Так вот мне интересно как работают конструктор и деструктор по умолчанию. Максимум что мне удалось выяснить, так это то что конструктор память инициализирует, а деструктор вычищает. Но никаких подробностей я узнать не смог. Как это происходит? Какая последовательность действий выполняется. Почему к примеру компилятор сам не выделяет память под объект, а взваливает это на плечи конструктора? Какие операции перегружаются для нового обьекта автоматически. Например мы можем сравнивать два новых обьекта не перегрузив опрацию сравнения? А присваивать один обект другому? И еще один вопрос. Когда при выполнении программы происходит освобождение стека от данных относящихся к этой области действия все обьекты тоже соотвественно стираются, но перед уничтожением обьекта происходит вызов деструктора. Но как? Ведь при "отмотке" стека происходит считывание адреса возврата, и управление просто передается во "внешнюю" часть программы. Как же тогда умудряется запуститься деструктор? Буду очень признателен, всем кто поможет мне разобраться в этом вопросе. Буду благодарен за любую помощь. Возможно кто то знает какую нибудь умную книжку(книги), где описаны подобные тонкие места программирования, или сайт или статью.
с++
Re: Как работают конструктор и деструктор по умолчанию?
От: Vain Россия google.ru
Дата: 26.03.11 14:47
Оценка: -1
Здравствуйте, wrongman, Вы писали:

W>Добрый день уважаемые форумчане.

И тебе добренький.

W>Почему к примеру компилятор сам не выделяет память под объект, а взваливает это на плечи конструктора?

Потому что конструктор не выделяет память под объект.

W>Какие операции перегружаются для нового обьекта автоматически.

Конструктор без параметров/копирования, оператор присваивания и оператор взятия адреса.

W>Например мы можем сравнивать два новых обьекта не перегрузив опрацию сравнения?

Можно, добавив просто функцию сравнения.

W>А присваивать один обект другому?

Да.

W>И еще один вопрос. Когда при выполнении программы происходит освобождение стека от данных относящихся к этой области действия все обьекты тоже соотвественно стираются, но перед уничтожением обьекта происходит вызов деструктора. Но как? Ведь при "отмотке" стека происходит считывание адреса возврата, и управление просто передается во "внешнюю" часть программы. Как же тогда умудряется запуститься деструктор?

Видимо компилятор проставляет вызов деструктора перед выходом из функции.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[2]: Как работают конструктор и деструктор по умолчанию?
От: wrongman  
Дата: 26.03.11 15:16
Оценка:
Vain, спасибо вам большое за ответ!

А зачем вообще компилятор создает конструктор по умолчанию? Если память под обьект он выделяет сам. Какой вообще тогда от конструктора прок? Я имею в виду случай когда мы сами явно не создаем конструктор по умолчанию, зачем тогда компилятор делает это за нас?
Re[3]: Как работают конструктор и деструктор по умолчанию?
От: Vain Россия google.ru
Дата: 26.03.11 15:54
Оценка:
Здравствуйте, wrongman, Вы писали:

W>А зачем вообще компилятор создает конструктор по умолчанию?

Есть два конструктора по умолчанию. Какой из них?

W>Если память под обьект он выделяет сам.

В каком месте он это делает по-вашему?

W>Какой вообще тогда от конструктора прок? Я имею в виду случай когда мы сами явно не создаем конструктор по умолчанию, зачем тогда компилятор делает это за нас?

Вы не можете создать конструктор по умолчанию, потому что тогда он станет объявленым пользователем конструктором (не по умолчанию уж точно).
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[3]: Как работают конструктор и деструктор по умолчанию?
От: ZegSoft Россия  
Дата: 26.03.11 15:58
Оценка:
Здравствуйте, wrongman, Вы писали:

W>Vain, спасибо вам большое за ответ!


W>А зачем вообще компилятор создает конструктор по умолчанию? Если память под обьект он выделяет сам. Какой вообще тогда от конструктора прок? Я имею в виду случай когда мы сами явно не создаем конструктор по умолчанию, зачем тогда компилятор делает это за нас?


Компилятор сам не может выделять память!!! Выделение памяти осуществяется на этапе выполнения программы. Компилятор же отвечает лишь за этап компиляции. Исключение составляют пожалуй только статические переменные. Вот их как раз инициализирует компилятор. Все же остальные переменные инициализируются во время выполнения. И программа должна знать, как именно их иницилизировать. И компилятор вовсе не создает конструктор по умолчанию! Это ТЫ САМ его создаешь в своем коде. Точно так же ты можешь его и не создавать.
Например,


class CTest
{
public:
int a;
int b;

};



будет отлично работать и, как видишь, никаких конструкторов по умолчанию тут и близко нет.
Re[3]: Как работают конструктор и деструктор по умолчанию?
От: wvoquine  
Дата: 26.03.11 16:12
Оценка:
Здравствуйте, wrongman, Вы писали:

W>Vain, спасибо вам большое за ответ!


W>А зачем вообще компилятор создает конструктор по умолчанию? Если память под обьект он выделяет сам. Какой вообще тогда от конструктора прок? Я имею в виду случай когда мы сами явно не создаем конструктор по умолчанию, зачем тогда компилятор делает это за нас?


Наверное, в первую очередь для единообразия. Например, время жизни объекта отсчитывается от того момента, когда закончился его конструктор. Неявный конструктор вызывает конструкторы базовых подобъектов и подобъектов-членов, ведь они могут быть и явно определёнными. Он и определён как inline public, что, наверное, мало отличается от того, как если бы "компилятор делал всё сам".

Кроме того есть такое понятие, как тривиальный конструктор — т.е. конструктор ничего реально не делает, когда это возможно.
To be is to be the value of a variable
Re[4]: Как работают конструктор и деструктор по умолчанию?
От: wvoquine  
Дата: 26.03.11 16:28
Оценка: +1
Здравствуйте, Vain, Вы писали:

V>Есть два конструктора по умолчанию. Какой из них?


Не, это такая путаница. Бывает неявный конструктор по умолчанию и явно определённый пользователем: по умолчанию — вызывается без аргументов.
To be is to be the value of a variable
Re: Как работают конструктор и деструктор по умолчанию?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.03.11 16:46
Оценка: -3
Здравствуйте, wrongman, Вы писали:

W>Добрый день уважаемые форумчане. Мой вопрос наверное покажется вам глупым. Но тем не менее, я нигде не смог найти на него ответа. Так вот мне интересно как работают конструктор и деструктор по умолчанию. Максимум что мне удалось выяснить, так это то что конструктор память инициализирует, а деструктор вычищает. Но никаких подробностей я узнать не смог. Как это происходит?


Есть скажем иерархия A<-B<-C

>new

>C()
>B()
>A()
<A()
<B()
<C()
<new

Каждый конструктор первым делом устанавливает lpvtbl на свою таблицу, т.е. в итоге даже если захотим вызвать вирт метод, нихрена не выйдет, а если метод абстрактный, то будет pure virtual call.Компилет страхует от этого непотребства и виртуальные вызовы заменяет на обычные.

>delete

>~C()
>~B()
>~A()
<~A()
<~B()
<~C()
<delete

Каждый деструктор первым делом уставнавливает lpvtbl на свою таблицу, точно так же как и конструктор.

Разница между вызовами конструктором и деструкторов примерно следующая — конструктор сначала вызывает базовый а потом отрабатывает сам, а деструктор сначала отрабатывает сам а потом вызывает базовый.

Почему к примеру компилятор сам не выделяет память под объект, а взваливает это на плечи конструктора?

Память выделяет new а освобождает delete

>Какие операции перегружаются для нового обьекта автоматически.


Операторы всякие

>Когда при выполнении программы происходит освобождение стека от данных относящихся к этой области действия все обьекты тоже соотвественно стираются, но перед уничтожением обьекта происходит вызов деструктора. Но как?


Компилятор создает всякие структурины, заполняет их и генерит спец. код, в котором с помощью своих структур вызывает деструкторы. Например если бросается исключение, то реально это проход по вверх по фреймам с вызовом деструкторов по ходу.

>Ведь при "отмотке" стека происходит считывание адреса возврата, и управление просто передается во "внешнюю" часть программы. Как же тогда умудряется запуститься деструктор? Буду очень признателен, всем кто поможет мне разобраться в этом вопросе. Буду благодарен за любую помощь. Возможно кто то знает какую нибудь умную книжку(книги), где описаны подобные тонкие места программирования, или сайт или статью.


Вот здесь описывается, почему тебе не надо знать этих тонкостей
http://www.microsoft.com/learning/en/us/book.aspx?ID=6522&amp;locale=en-us
Re[5]: Как работают конструктор и деструктор по умолчанию?
От: Vain Россия google.ru
Дата: 26.03.11 17:08
Оценка: -1
Здравствуйте, wvoquine, Вы писали:

V>>Есть два конструктора по умолчанию. Какой из них?

W>Не, это такая путаница. Бывает неявный конструктор по умолчанию и явно определённый пользователем: по умолчанию — вызывается без аргументов.
По-русски, конструктор по умолчанию это тот который генерирует компилятор. А тот про которой вы говорите называется конструктором без параметров.
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[6]: Как работают конструктор и деструктор по умолчанию?
От: wvoquine  
Дата: 26.03.11 17:19
Оценка: :))
Здравствуйте, Vain, Вы писали:

V>Здравствуйте, wvoquine, Вы писали:


V>>>Есть два конструктора по умолчанию. Какой из них?

W>>Не, это такая путаница. Бывает неявный конструктор по умолчанию и явно определённый пользователем: по умолчанию — вызывается без аргументов.
V>По-русски, конструктор по умолчанию это тот который генерирует компилятор. А тот про которой вы говорите называется конструктором без параметров.

А русская википедия поддерживает мою версию :
http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_%D0%BF%D0%BE_%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E
To be is to be the value of a variable
Re[2]: Как работают конструктор и деструктор по умолчанию?
От: Alexey_VL  
Дата: 26.03.11 17:20
Оценка:
Здравствуйте, Vain, Вы писали:

W>>Какие операции перегружаются для нового обьекта автоматически.

V>Конструктор без параметров/копирования, оператор присваивания и оператор взятия адреса.

Деструктор забыли
Мафиозная диктатура это нестабильность. Если не мафиозная диктатура, то Конституция и демократия.
Re: Как работают конструктор и деструктор по умолчанию?
От: v2kochetov Россия  
Дата: 26.03.11 17:39
Оценка: -3
Здравствуйте, wrongman, Вы писали:

W>Добрый день уважаемые форумчане. Мой вопрос наверное покажется вам глупым. Но тем не менее, я нигде не смог найти на него ответа. Так вот мне интересно как работают конструктор и деструктор по умолчанию. Максимум что мне удалось выяснить, так это то что конструктор память инициализирует, а деструктор вычищает. Но никаких подробностей я узнать не смог. Как это происходит? Какая последовательность действий выполняется. Почему к примеру компилятор сам не выделяет память под объект, а взваливает это на плечи конструктора? Какие операции перегружаются для нового обьекта автоматически. Например мы можем сравнивать два новых обьекта не перегрузив опрацию сравнения? А присваивать один обект другому? И еще один вопрос. Когда при выполнении программы происходит освобождение стека от данных относящихся к этой области действия все обьекты тоже соотвественно стираются, но перед уничтожением обьекта происходит вызов деструктора. Но как? Ведь при "отмотке" стека происходит считывание адреса возврата, и управление просто передается во "внешнюю" часть программы. Как же тогда умудряется запуститься деструктор? Буду очень признателен, всем кто поможет мне разобраться в этом вопросе. Буду благодарен за любую помощь. Возможно кто то знает какую нибудь умную книжку(книги), где описаны подобные тонкие места программирования, или сайт или статью.


Можно условно считать что в конструкторе выделяется память для всех членов объекта, в деструкторе эта память освобождается, компилятор просто достаточно умный чтобы сгенерировать код для этих целей в относительно простых случаях. Если хорошо знаешь ассемблер, можно набросать очень маленький пример и посмотреть что получается и как это работает, если плохо, то вот и ответ на твой вопрос — выбирай книжку по асму и читай листинг сгенерированный с++ компилятором.
Re[2]: Как работают конструктор и деструктор по умолчанию?
От: v2kochetov Россия  
Дата: 26.03.11 17:41
Оценка:
Здравствуйте, Ikemefula, Вы писали:

I>Вот здесь описывается, почему тебе не надо знать этих тонкостей

I>http://www.microsoft.com/learning/en/us/book.aspx?ID=6522&amp;locale=en-us

На какой странице? Рихтер вроде наоборот отличался любовью к тонкостям.
Re[7]: Как работают конструктор и деструктор по умолчанию?
От: Ops Россия  
Дата: 26.03.11 18:28
Оценка:
Здравствуйте, wvoquine, Вы писали:

W>Здравствуйте, Vain, Вы писали:


V>>Здравствуйте, wvoquine, Вы писали:


V>>>>Есть два конструктора по умолчанию. Какой из них?

W>>>Не, это такая путаница. Бывает неявный конструктор по умолчанию и явно определённый пользователем: по умолчанию — вызывается без аргументов.
V>>По-русски, конструктор по умолчанию это тот который генерирует компилятор. А тот про которой вы говорите называется конструктором без параметров.

W>А русская википедия поддерживает мою версию :

W>http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_%D0%BF%D0%BE_%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E

А я не поддерживаю википедию — мало ли, что Вы там написали? У меня вот Firefox слово "википедия" подчеркивает как ошибочное. А на слово "словарь", как и на "энциклопедию" не ругается.
Переубедить Вас, к сожалению, мне не удастся, поэтому сразу перейду к оскорблениям.
Re[8]: Как работают конструктор и деструктор по умолчанию?
От: wvoquine  
Дата: 26.03.11 18:41
Оценка:
Здравствуйте, Ops, Вы писали:

Ops>Здравствуйте, wvoquine, Вы писали:


W>>Здравствуйте, Vain, Вы писали:


V>>>Здравствуйте, wvoquine, Вы писали:


V>>>>>Есть два конструктора по умолчанию. Какой из них?

W>>>>Не, это такая путаница. Бывает неявный конструктор по умолчанию и явно определённый пользователем: по умолчанию — вызывается без аргументов.
V>>>По-русски, конструктор по умолчанию это тот который генерирует компилятор. А тот про которой вы говорите называется конструктором без параметров.

W>>А русская википедия поддерживает мою версию :

W>>http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_%D0%BF%D0%BE_%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E

Ops>А я не поддерживаю википедию — мало ли, что Вы там написали? У меня вот Firefox слово "википедия" подчеркивает как ошибочное. А на слово "словарь", как и на "энциклопедию" не ругается.


Ну, русскую вики, наверное, и не стоит так "поддерживать"
To be is to be the value of a variable
Re[3]: Как работают конструктор и деструктор по умолчанию?
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.03.11 19:02
Оценка: +1
Здравствуйте, v2kochetov, Вы писали:

I>>Вот здесь описывается, почему тебе не надо знать этих тонкостей

I>>http://www.microsoft.com/learning/en/us/book.aspx?ID=6522&amp;locale=en-us

V>На какой странице? Рихтер вроде наоборот отличался любовью к тонкостям.


Ты хотел тонкостев по С++ в книге про С# и CLR .Net ?

Вобщем, тут надо было смеяться
Re[3]: Как работают конструктор и деструктор по умолчанию?
От: Vain Россия google.ru
Дата: 26.03.11 19:23
Оценка:
Здравствуйте, Alexey_VL, Вы писали:

W>>>Какие операции перегружаются для нового обьекта автоматически.

V>>Конструктор без параметров/копирования, оператор присваивания и оператор взятия адреса.
A_V>Деструктор забыли
чорт, виртуальный деструктор!
[In theory there is no difference between theory and practice. In
practice there is.]
[Даю очевидные ответы на риторические вопросы]
Re[7]: Как работают конструктор и деструктор по умолчанию?
От: CreatorCray  
Дата: 26.03.11 20:47
Оценка:
Здравствуйте, wvoquine, Вы писали:

W>А русская википедия поддерживает мою версию :

W>http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_%D0%BF%D0%BE_%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E
Ты бы лучше на стандарт ссылался.
Глядишь, в поисках параграфа стандарта на который надо сослаться вопрос решился бы сам собой.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[8]: Как работают конструктор и деструктор по умолчанию?
От: wvoquine  
Дата: 26.03.11 21:12
Оценка:
Здравствуйте, CreatorCray, Вы писали:

CC>Здравствуйте, wvoquine, Вы писали:


W>>А русская википедия поддерживает мою версию :

W>>http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_%D0%BF%D0%BE_%D1%83%D0%BC%D0%BE%D0%BB%D1%87%D0%B0%D0%BD%D0%B8%D1%8E
CC>Ты бы лучше на стандарт ссылался.
CC>Глядишь, в поисках параграфа стандарта на который надо сослаться вопрос решился бы сам собой.

А где на стандарт на русском можно сослаться?
To be is to be the value of a variable
Re[9]: Как работают конструктор и деструктор по умолчанию?
От: CreatorCray  
Дата: 26.03.11 21:34
Оценка:
Здравствуйте, wvoquine, Вы писали:

W>А где на стандарт на русском можно сослаться?

В программировании без английского тяжко придётся.
Так что видимо сначала придётся подтянуть английский.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.