|
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
|
||||||
Можно ли Конструктор и Деструктор вызывать как метод класса?29.06.2019, 12:03. Показов 21966. Ответов 222
Метки нет (Все метки)
Собственно вопрос:
можно ли Конструктор и Деструктор вызывать вручную, как обычный метод класса? Например, я хочу управлять очередностью вызовов. См. пример:
0
|
||||||
| 29.06.2019, 12:03 | |
|
Ответы с готовыми решениями:
222
Как правильно вызывать конструктор шаблонного класса? Можно ли явным образом вызывать деструктор? Конструктор и деструктор анонимного класса |
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 01.07.2019, 16:41 | ||
|
0
|
||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||
| 01.07.2019, 17:00 | ||
|
вот ссылка еще раз https://timsong-cpp.github.io/... sic.life#8 и там есть правила что в случае такого фокуса как здесь: Можно ли Конструктор и Деструктор вызывать как метод класса? от имени объекта (std::string s) можно ссылаться на новые данные нового объекта только если правила по ссылке выше соблюдаются. если же правила не соблюдаются, то мы не имеем права от имени старого объекта обращаться к новым данным нового объекта а реализация std::string здесь при том, что ты не знаешь что там под капотом. соответственно ты так же не знаешь попадает ли эта реализация под правила которые по ссылке отсюда и UB. не имея гарантий насчет реализации std::string ты не знаешь по каким правилам вообще будет функционировать твоя программа и можно ли вообще используя переменную s считывать новые данные из памяти Добавлено через 14 минут Проще говоря, корректно ли использование подобного трюка сильно зависит от реализации типа, над которым этот трюк воспроизводится. А если о реализации типа ничего неизвестно, значит результат будет не определён.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||
| 01.07.2019, 17:26 | ||||||
|
Добавлено через 6 минут за жизнь трепяццо. один - ёжик, другой - Undisputed. - у нас тут UB - чегой то? - ну смотри, если автомобиль едет на красный свет, стало быть - шандец? - ну шандец. - ну и вот, а поскольку мы не знаем кто за рулем, стало быть не знаем, поедет ли он на красный свет... с такой ахрененной логикой можно "логично" доказать все что угодно. давай конкретно и по пунктам. какие такие правила у тебя не соблюдаются. и почему. Добавлено через 6 минут вот ещё раз свою ссылочку волшебную открой и покажи (процитируй) потому что там ничего даже отдаленно похожего на этот бред.
0
|
||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
||||||
| 01.07.2019, 18:11 | ||||||
|
Об истечении lifetime этого объекта свидетельствует пункт
Итого: У тебя есть storage просроченного объекта, в котором ты конструируешь новый объект. Тем самым ты попадаешь под выделенную жирным часть ниже:
Вот эти условия:
А эти пункты как видно завязаны на реализацию объекта, в данном случае это std::string. Не имея гарантий относительно внутреннего устройства std::string, ты не имеешь гарантий того что попадаешь под эти пункты. Соответственно, каким будет результат этого кода: Можно ли Конструктор и Деструктор вызывать как метод класса? лучше даже и не гадать ![]() ну вот и прошлись по пунктам с чем конкретно ты не согласен?
1
|
||||||
|
Комп_Оратор)
|
||||||||||
| 01.07.2019, 19:23 | ||||||||||
|
Опять фантазия. Fulcrum_013, я стеснялся сначала сказать, что привык считать инстансом то что все в С++ считают инстансом - конкретный класс из шаблонна классов. Теперь придётся и это сказать. С моей точки зрения, в данную тему вы привнесли опасение, что после вызова деструктора на объекте выделенном new явно (не размещением) автомат стека какого-то (идиотского) компилятора, может освободить физическое адресное пространство, которое занимал усопший. Я такого ни где и ни когда не видел. Всякий раз попытка вызвать деструктор принудительно и без повторной инициализации наказывалась крэшем при выходе из области, что свидетельствовало о том, что ни один из известных мне компиляторов не отслеживал явного вызова деструктора и тупо запускал его в автоматическом режиме. Это правильно. Он не делает лишних телодвижений и выдаёт максимальную скорость. Но и на стеке легко получить код который не может вызвать освобождения памяти с запуском деструктора. Для этого достаточно объявить автоматический массив типа:
Вопрос остался вами не затронутым. А вот пространство форума выделяется тоже по странично. Посмотрите сколько пустых страниц мы с вами истратили. Но вас нельзя остановить. Это кстати хорошо ложится в предложенную вами парадигму: Добавлено через 29 минут А вот что касается попыток получить тот же объект по данным, это уже другой вопрос. Объект который мы пытаемся склонировать вполне мог запустить ракету, логировать пуск и потерять доступ к файлу. Или много чего ещё. Остальные данные, которые можно довести до ума после конструирования... можно довести до ума. О чём тогда спорим? Называть ли его новым или старым. Пусть те кому нравятся старые ссылки на новые объекты считают его новым. А те кто это не воспринимает будут делать вид (не спорить же со стандартом), но внутренне надеяться, что что-то в мире пойдёт к лучшему.
0
|
||||||||||
|
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
|
|
| 01.07.2019, 19:53 | |
|
IGPIGP,
А при чем тут конфессии? есть язык и есть правила этого языка, вот и все ![]() Иначе был бы бардак... Вот от этих правил и предлагаю отталкиваться а не от своих что бы все были на одной волне. Таким образом думаю можно приблизиться к тому, что все будут говорить на одном и понятном друг другу языке
0
|
|
|
Комп_Оратор)
|
|
| 01.07.2019, 20:54 | |
|
Undisputed, если бы вопрос был в формальных правилах то писать и читать такую тему было бы мягко говоря глупо. Очень мягко говоря.
Поэтому то, что вы говорите не соответствует вопросу. Поверьте, ни кто не собирается спорить со стандартом. Даже с плохим. Потому что плохой Но вопросы в том -как относиться к конструированию/деструктурированию, -что называть объектом. -каково должно быть определение в стандарте базового понятия, вылились в обсуждение вопроса о том, является ли реинициализированный объект тем объектом, что был деинициализирован до него, с точки зрения программы. Мне совершенно ясно, что технически так оно и есть. Но было много интересных доводов в пользу того, что -с каждым новым тактом процессора мир, компьютер и объект в нём становятся новыми; -с точки зрения ООП объект это то что ни как нельзя возродить (плюсовая реализация RAII вошла в клинч с общими парадигмами объектного подхода к анализу внешнего мира). -истина в стандарте, и стандарт всегда прав. Тема удалась, я думаю.
0
|
|
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 01.07.2019, 21:01 | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 01.07.2019, 21:15 | ||
|
Что такое инстанцирование? Что касается адреса объекта то именно он не изменяется в нашем обсуждении. Посмотрите цитату черновика приведенную Undisputed. Там видно что чья-то левая нога захотела назвать объект новым, но при этом (при соблюдении ряда очевидных условий) к нему можно обращаться как к "старому", используя имя, ссылки и пр. Это кстати полностью нивелирует страшные фантазии о том, что стек или компилятор инвалидизируют объект в момент запуска деструктора включая адрес... Не знаю, что ещё сказать. Если бы эта нога захотела оставить за объектом и совершенно опустевшее (после переноса ссылок) то есть, формальное право считаться старым объектом (реинициализированным, конечно), то ни чего бы не изменилось, кроме более консистентной логики. Но это дело вкуса (я писал на 2 или 3 странице ещё ) и тот разговор который мы провели показал хороший срез мира C++. Это тоже полезно для новичков, я думаю.
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 01.07.2019, 21:26 | ||
|
0
|
||
|
Комп_Оратор)
|
||
| 01.07.2019, 22:16 | ||
|
Ссылка это псевдоним объекта (объекта Карл). Это неофициальное определение, но лучше такое чем никакого. Это потому, что ссылка в момент инициализации связывается с объектом и это коренная фича языка (не удачная на мой взгляд, но у неё есть и хорошие стороны). Ссылка менее наивна чем указатель? Нет. Указатель прагматичен и его можно проверить на nullptr. Он требует больше дисциплины, но более гибок. Ссылка привязана к объекту и является его псевдонимом. Она надеется что объект валиден и как мы видели в теме - наивна. Но привязана она к адресу и типу. Этого достаточно чтобы быть псевдонимом объекта. Уникального объекта. Видите, как производное понятие (ссылка) строится на базовом (объект). И когда кому-то взбрендило внести противоречие в понятие объект, сразу разрушилось определение ссылки. Она стала псевдонимом разных объектов. Теперь если добавить инстансы, имиджи, и пр. нечисть, станет веселее. У объектов появятся запахи (они уже есть, кстати) оттенки, характер и пр. Вопрос лишь в том, как к этому относиться, а предмета для серьёзного спора тут не видно.
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 02.07.2019, 16:12 | ||
|
0
|
||
|
Комп_Оратор)
|
||||
| 02.07.2019, 16:29 | ||||
|
Инстансуализм не пройдет, Fulcrum_013. Сторонники традиционной терминологии дадут достойную отповедь.
0
|
||||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
||
| 02.07.2019, 16:38 | ||
|
IGPIGP, точно так же экземпляр класса. т.е. конкретный кусок памяти где создана структура данных описываемая классом. Или экземплят шаблона. Конкретный кусок кода сгенерированный для конкретного набора аргументов шаблона.
Добавлено через 4 минуты
0
|
||
|
Комп_Оратор)
|
||
| 02.07.2019, 16:41 | ||
|
Но и это мало вяжется в тему. Хотя к тому что уже на инстанцировано, трудно добавить что-то лишнее. И так полно лишнего.
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||
| 02.07.2019, 16:49 | |||
|
Добавлено через 4 минуты Т.е. еще раз - инстанс переводитс как экземпляр. Соответсвенно экземпляр функции, экземпляр типа, экземпляр класса. Все просто. Как раз слово после экземпляр задает контекст в котором это слово экземпляр понимать. Пока дело крутится в одном контексте - к примеру ООП для краткости слово "класса" после слова "экземпляр" опускают. Но как только разговор идет о нескольких контекстах то надо уточнять.
0
|
|||
|
Комп_Оратор)
|
||
| 02.07.2019, 16:49 | ||
|
Но помилуйте Fulcrum_013, при чем тут разговор о реинкарнации объекта и формальном в общем-то утверждении из стандарта: "Объект умер! Даздравствует объект!". Мы тут не касались просторов вселенной и вели себя смирно. имхо. А вы пришли и всех раскидали. Своим инстансом. Прекратите им размахивать.
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|
| 02.07.2019, 16:50 | |
|
IGPIGP, А сточки зрения того как работают системы языка рассматривать новизну/неновезну экземпляра класса - бессмыслица. Потому что живут они в рамках математической модели которая в описание языка не входит.
0
|
|
|
Комп_Оратор)
|
||
| 02.07.2019, 17:15 | ||
|
0
|
||
|
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
|
|||||||
| 02.07.2019, 17:25 | |||||||
|
Добавлено через 5 минут При этом есть и второй момент где адрес просто меняется а объекты остаются те же. Например реаллокация вектора. Его элементы которые оказались после этого по другим адресам - это новые объекты или старые? По логике вещей старые. А по вашей мере получается новые. Добавлено через 4 минуты точно так же после
0
|
|||||||
| 02.07.2019, 17:25 | |
|
Зачем нужны конструктор и деструктор класса? Дописать конструктор и деструктор для класса Для класса задать конструктор и деструктор Конструктор (деструктор) у класса, не имеющего тип Создание класса с перегрузкой операторов конструктор и деструктор Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/
TL DR
Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|