|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
27.02.2011, 22:50 | #1 |
Пользователь
Регистрация: 27.02.2011
Сообщений: 22
|
Передача объекта в функцию, и его деструкторы
Такой вот код..
Код:
Constr MyBase1 0012FF57 Constre MyBase2 0012FF58 Constre base3 0012FF57 Constr MyDelClass 0012FF57 addr of o: 0012FF57 addr of r: 0012FE58 Destr base3 0012FE58 Destr MyBase2 0012FE59 Destr MyBase1 0012FE58 Destr base3 0012FE73 Destr MyBase2 0012FE74 Destr MyBase1 0012FE73 Destr MyDelClass 0012FF57 Destr base3 0012FF57 Destr MyBase2 0012FF58 Destr MyBase1 0012FF57 ...Вызывается деструкторы объекта r, его адрес 0012FE58, 59, 58 Вызываются и у объекта o 0012FF57, 57, 58, 57 А между ними идёт вызов деструкторов 0012FE73, 74, 73. Откуда они берутся, это промежуточная переменная что ли?? Последний раз редактировалось Janym; 27.02.2011 в 23:04. |
27.02.2011, 23:38 | #2 |
Форумчанин
Регистрация: 31.01.2011
Сообщений: 160
|
все просто, поменяйте void Funct(MyBase3 r) на void Funct(MyBase3& r) и они пропадут))
на самом деле в вашем случае для MyBase3 вызывается конструктор копирования, но так как он у вас явно не объявлен - вызывается по умолчанию тем не менее деструкторы так же вызываются вообщем это эффект создания временного объекта при передаче по значению |
27.02.2011, 23:44 | #3 |
Участник клуба Подтвердите свой е-майл
Регистрация: 19.11.2007
Сообщений: 1,022
|
Когда функция
Код:
Если конечно я правильно понял вопрос. Последний раз редактировалось profi; 27.02.2011 в 23:55. |
27.02.2011, 23:45 | #4 |
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
|
при передаче объекта в функцию по значению (а также при использовании объекта в кач-ве возвращаемого значения функции, а также при копирующей инициализации) создается временная копия объекта но конструктор не вызывается (логически это можно понять так - ведь конструктор нужен чтобы иницализировать объект с нуля объект, а нам нужно скопировать данные), но при выходе из области видимости - вызывается деструктор - в вашем случае объекта MyDelClass ( а он повлёк за собой деструкторы MyBase3, MyBase2 и MyBase1).
для таких случаев придумали копирующий конструктор, или как вариант передавать объект по ссылке. |
27.02.2011, 23:49 | #5 |
Участник клуба Подтвердите свой е-майл
Регистрация: 19.11.2007
Сообщений: 1,022
|
onewho вчитался в ваши слова внимательнее и удалил сообщение .
Последний раз редактировалось profi; 27.02.2011 в 23:59. |
27.02.2011, 23:54 | #6 |
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
|
спасибо, но разве я не написал то же самое ?
|
28.02.2011, 00:16 | #7 |
Пользователь
Регистрация: 27.02.2011
Сообщений: 22
|
2 alex_x_x
Это понятно ) Лучше использовать * или по &. Просто стало интересно почему по значению такое получается. 2 onewho Но в данном случае как раз переменная r и есть временная копия, зачем же ещё другую создавать с адресом 0012FE73 .. ? Ведь при вызове кода: Код:
|
28.02.2011, 00:25 | #8 |
Линуксоид
Участник клуба
Регистрация: 31.07.2009
Сообщений: 1,403
|
Если у тебя есть функция void myFunc(MyClass x), то при её вызове myFunc(my_object) создастся копия объекта my_object (поэтому-то и вызывается конструктор! ведь надо создать копию), она-то и будет x. Так что если ты будешь менять x, то это не изменит my_object. Это называется передачей по значению.
Если у тебя есть функция void myFunc(MyClass &x), то при её вызове myFunc(my_object) создастся указатель на объект my_object, а при обращении к x этот указатель будет разыменовываться. Так что если ты будешь менять x, то это будет менять и my_object. Это называется передачей по ссылке. Если ты хочешь запретить менять x, но не хочешь создавать копию объекта, используй void myFunc(const MyClass &x). Это называется передачей по константной ссылке. Иногда используют также передачу по указателю void myFunc(MyClass *x) и по константному указателю void myFunc(const MyClass *x).
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su Последний раз редактировалось Obey-Kun; 28.02.2011 в 12:41. |
28.02.2011, 00:39 | #9 | |
Пользователь
Регистрация: 27.02.2011
Сообщений: 22
|
Цитата:
Копия не вызовет конструктор, а только деструктор. Не понятно другое, зачем по мимо временной переменной r компилятор ещё где-то создаёт переменную.. |
|
28.02.2011, 01:02 | #10 |
Форумчанин
Регистрация: 29.09.2010
Сообщений: 636
|
именно эта переменная r и создается! она же должна сразу инициализироваться с помощью копирующего конструктора.
Obey-Kun, не встречал такую запись void myFunc(class MyClass &x) может ты имел ввиду void myFunc(const MyClass &x) ? |
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Изменение свойств объекта не активируя его | ndvikulov | Microsoft Office Excel | 16 | 16.09.2010 20:14 |
Передача метода объекта. | the_deer_one | Общие вопросы C/C++ | 8 | 09.09.2010 15:07 |
Можно ли в макрос передать имя объекта, его вызывающего | buagbu | Microsoft Office Excel | 3 | 16.04.2010 08:54 |
Передача объекта в функцию | Юра_YUYU | Общие вопросы C/C++ | 14 | 18.01.2010 16:00 |
Проверка объекта после его уничтожения | AHTuKiLLeR | Общие вопросы Delphi | 1 | 19.06.2009 10:43 |