1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144

Можно ли Конструктор и Деструктор вызывать как метод класса?

29.06.2019, 12:03. Показов 21059. Ответов 222
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно вопрос:
можно ли Конструктор и Деструктор вызывать вручную, как обычный метод класса?
Например, я хочу управлять очередностью вызовов. См. пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class FirstClass   
{
public:
    FirstClass()
    {
    }
};
 
class SecondClass : public FirstClass   
{
public:
    SecondClass()
    {
      // ...
 
      FirstClass ();  // А здесь его можно вызвать?  
    }
 };
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
29.06.2019, 12:03
Ответы с готовыми решениями:

Как правильно вызывать конструктор шаблонного класса?
Как правильно вызывать конструктор класса? template <class T> class A{ T *v; int dim; public: A(T *a,int n); }; ...

Можно ли явным образом вызывать деструктор?
Например. Имеется перегруженный в классе оператор присваивания: square_matrix square_matrix::operator= (square_matrix matrix) { if...

Конструктор и деструктор анонимного класса
Здравствуйте. Есть ли в С++ такая возможность? Очень нужна именно такая реализация класса, но если это невозможно, буду думать.

222
Отпрыск ChatGPT
 Аватар для Azawa
266 / 31 / 4
Регистрация: 18.06.2019
Сообщений: 155
30.06.2019, 22:17
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от vlisp Посмотреть сообщение
ога... только вот кто вам разрешит напрямую распоряжаться памятью? это же ось на этом уровне командует парадом?
Динамически выделяемой памятью да, ОС перекроет доступ если ее освободить.
А если объект находится в стеке?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 22:21
Цитата Сообщение от Azawa Посмотреть сообщение
_stanislav, вот это правильно, лучше всегда заново вызывать конструктор чтобы обновить ссылки и указатели. Вообще не понимаю о чем спор, использовать оставшийся в памяти призрак деструктированного объекта в любом случае плохо.
Речь идёт именно о деинициализированном, а потом реинициализированном объекте. То есть, деструктор осуществит любую заданную в нём политику владения в части освобождения, а конструктор сделает то же самое, но в части захвата. Вы всё правильно говорите. Но речь именно об этом. Об обращениях к деструкторизованным объектом тут не говорят.

Добавлено через 2 минуты
Цитата Сообщение от Azawa Посмотреть сообщение
Динамически выделяемой памятью да, ОС перекроет доступ если ее освободить.
Опять-таки. Ни кто не собирается вызывать delete на указателе. А прямой вызов деструктора на указателе ptr_obj->~MyClass(); не освободит память. А потом placement new. В принципе и тут и на стеке, нет разницы.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 22:21
Цитата Сообщение от _stanislav Посмотреть сообщение
а как же адреса и ссылки которые содержал объект (вообще конструкторы могут быть разные и инварианты тоже), они же не всегда могут быть одинаковые между двумя вызовами конструктора?
а при чем здесь вообще адреса и ссылки, которые содержит объект?

вот например:

C++
1
2
std::string v = "hello ";  // 1
v += "world";  // 1
после модификации строки,
внутренние данные объекта очевидно изменились.

ну и что? объект перестал быть самим собой?



другой пример:

стандарт говорит, что ежели объект переместить (std::move),
то он должен оказаться в unspecified состоянии.

unspecified состояние - это ситуация,
когда точно не известно чем будет заполнена память.
и не известно в каком логическом состоянии находится объект.
однако известно, что:

- обязан корректно работать деструктор
опустошенный объект должен суметь корректно разрушиться.

- обязаны корректно работать сеттеры/операторы присвоения.
если опустошенному объекту явным образом присвоить новое состояние,
тогда unspecified сменяется на это явное состояние.

пример:

C++
1
2
3
4
5
6
7
8
9
10
11
12
std::string v = "hello";
 
occupy(std::move(v)); //<--- перемещаем
 
// <--- вот здесь объект unspecified 
// нельзя знать наверняка 
// в каком состоянии находятся внутренние данные объекта
 
v = "world"; 
 
// <--- вот здесь объект в согласованном состоянии
// и точно известно, что он содержит строку "world"
когда объект вновь переходит в согласованное состояние,
ни у кого не возникает сомнений,
что это - абсолютно тот же самый объект,
и пофигу, что внутренние ссылки/указатели заново перенацелены на новые данные.

фокус же в том, что технически,
процедура присвоения объекту нового состояния ничем не отличается
от "воскрешения" объекта при помощи new placement.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 22:23
Цитата Сообщение от hoggy Посмотреть сообщение
а при чем здесь вообще адреса и ссылки, которые содержит объект?
Всё верно. Состояние объекта и объект не одно и то же самое.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 22:25
Цитата Сообщение от vlisp Посмотреть сообщение
только вот кто вам разрешит напрямую распоряжаться памятью?
киллер-фича с/с++ - прямой доступ к памяти.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 22:35
hoggy, допустим
1 ты сконструировал объект на каком то адресе не суть.
2 что то поделал с этим объектом
3 сломал его деструктором и по новой сконструировал его на том же адресе.
где гарантии что все его прежние зависимости восстановятся в состоянии 2?

Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
Состояние объекта и объект не одно и то же самое.
состояние объекта это часть объекта.

Добавлено через 2 минуты
hoggy, троллишь ты по ходу дела просто.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 22:41
Цитата Сообщение от _stanislav Посмотреть сообщение
где гарантии что все его прежние зависимости восстановятся в состоянии 2?
Гарантии те же что и при конструировании его изначально. Если первое конструирование + жизненный промежуток не изменили состояние объекта и окружения необратимо.
А кто даёт гарантии при конструировании как таковом? Оно гарантировано настолько насколько оно возможно. Но не более. И слова ломать и конструировать ломают восприятие. Инициализация и деинициализация соответствуют по смыслу. А речь о том считать ли оба объекта одним и тем же объектом. Вопрос холиварный. Однако, математическая мания ломать свои же абстракции доводя их до абсурда это единственная закономерность.
_stanislav, вот ссылка:
C++
1
2
3
4
5
A a;
A& ra(a);
a.~A();
new(&a) A();
//ссылка смотрит в новый объект или в тот же?
?


Добавлено через 1 минуту
Цитата Сообщение от _stanislav Посмотреть сообщение
hoggy, троллишь ты по ходу дела просто.
Твой слог магистра Йода слог напоминать начал.
Да пребудет с тобой ссылка. Вопрос о ней не троллинг отнюдь.
1
Отпрыск ChatGPT
 Аватар для Azawa
266 / 31 / 4
Регистрация: 18.06.2019
Сообщений: 155
30.06.2019, 22:49
IGPIGP, а, ну да получается. Все равно как-то логичнее считать данные объекта мусором после вызова деструктора и не использовать их в дальнейшем, даже если на них построен новый объект такого же типа. Как-то, надежность такого повторного использования данных не вызывает доверия.

Обязан ли деструктор никогда не очищать память, или некоторые компиляторы могут реализовать самоочистку памяти нулями? Или, может конструктор в какой-то момент поместить поля класса в другом порядке? Я не знаю, поэтому сомневаюсь в надежности.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 22:51
Цитата Сообщение от IGPIGP Посмотреть сообщение
Твой слог магистра Йода слог напоминать начал.

Цитата Сообщение от IGPIGP Посмотреть сообщение
//ссылка смотрит в новый объект или в тот же?
естественно в новый. был вызван деструктор, был вызван конструктор.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 23:00
Цитата Сообщение от _stanislav Посмотреть сообщение
естественно в новый.
Это философский момент. С этого момента ты на той стороне ссылки которая считает что у ссылки есть другая сторона. А я остаюсь на этой.
Цитата Сообщение от Azawa Посмотреть сообщение
IGPIGP, а, ну да получается. Все равно как-то логичнее считать данные объекта мусором после вызова деструктора и не использовать их в дальнейшем, даже если на них построен новый объект такого же типа.
Нет. Если объект реинициализирован, то не он ни тот кто к нему обращается не могут определить старый он или новый если данные идентичны. И даже если данные не идентичны, то состояние не идентифицирует объект всё едино. Вот если Вы изменяете поле объекта, Вы же не считаете, что получаете новый объект? Греческое: "Никто не может дважды войти в одну и ту же реку переменную" оставим грекам.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 23:02
Цитата Сообщение от _stanislav Посмотреть сообщение
где гарантии что все его прежние зависимости восстановятся в состоянии 2?
ты сам понял, о чем спросил?
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 23:02
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это философский момент.
аналогия пришла в голову. построил на каком то фундаменте (на адресе) дом, разобрал его и на том же фундаменте из тех же досок построил опять дом? это тот же дом или нет?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 23:08
Цитата Сообщение от _stanislav Посмотреть сообщение
это тот же дом или нет?
Он тот же ровно на столько, насколько ты не можежешь его отличить от прежнего. Однако на пальцах это трудно. Сравнивать объекты с пальцами, домами, слонами в данном контексте, это приём не удачный.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 23:11
но суть в том что если старый объект разрушен, нельзя конструировать на его же месте новый объект и использовать его как старый. и еще тема меня утомила
0
 Аватар для zayats80888
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
30.06.2019, 23:23
Цитата Сообщение от _stanislav Посмотреть сообщение
но суть в том что если старый объект разрушен, нельзя конструировать на его же месте новый объект и использовать его как старый.
исходя из этой логики, если вызвать для него какой-нить метод, меняющий состояние(operator= например), его тоже нельзя использовать как прежде, но это все тот же объект.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 23:26
Цитата Сообщение от _stanislav Посмотреть сообщение
нельзя конструировать на его же месте новый объект и использовать его как старый
это твоя фантазия и ты видишь её не состоятельность. Поэтому
Цитата Сообщение от _stanislav Посмотреть сообщение
тема меня утомила
но не стоит добавлять сложностей. Можно/нельзя, это новый виток. Мы сейчас в точке, где мнения о объекте старом/новом разделились. Комитет по стандартизации сочинил длинную историю о том что делают объекты и что можно сделать с объектами. Потому, что сегодня дать определение кратко и сухо они не могут. Наверное потому, что абстракция утратила логическую консистентность. А может просто не хотят. На этом мнения и разделились. А вот о можно и нельзя, - другая тема. На самом деле - можно. Вопрос не в этом.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
30.06.2019, 23:45
Цитата Сообщение от _stanislav Посмотреть сообщение
естественно в новый.
Не обязательно. См. https://timsong-cpp.github.io/... sic.life#8
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это философский момент.
Для тех, кто не читал что по ссылке.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
01.07.2019, 00:21
Цитата Сообщение от _stanislav Посмотреть сообщение
суть в том что если старый объект разрушен, нельзя конструировать на его же месте новый объект и использовать его как старый.
религия не позволяет?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
01.07.2019, 00:29
Цитата Сообщение от rat0r Посмотреть сообщение
Для тех, кто не читал что по ссылке.
Читал. И не вижу различий между старым и новым объектом, кроме экзальтированного призыва считать переинициализированный объект новым.
rat0r, я не беру во внимание случаи наличия статического счётчика сконструированных объектов и константной переменной экземпляра фиксирующей номер данного объекта в момент его инициализации. Такой приём, действительно может создать барьер между старыми и новыми объектами, но он не кажется мне убедительным. Не только потому, что счётчик переполняем. Потому, что понятие объекта изначально замыслено как базовое понятие RAII и это значительно более низкоуровневая абстракция. Другое дело, что можно разрешить компиляторщикам играть и с объектами.
В плохую погоду бывают кошмарные сны и они вещают, о супер вирусной эпидемии, мировой войне и... и даже виртуальной машине С++
Близится пришествие неизбежного. имхо.
0
 Аватар для Fulcrum_013
2083 / 1576 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
01.07.2019, 00:30
Цитата Сообщение от _stanislav Посмотреть сообщение
но суть в том что если старый объект разрушен, нельзя конструировать на его же месте новый объект
А коммитет то не в курсе. И все контейнеры налепили так что они на старом месте удаленных новые инстансы констрактят. Ой ойо шо буде.... весь софт на плюсах вооще работать не может....
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.07.2019, 00:30

Зачем нужны конструктор и деструктор класса?
вот задание: Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в динамической области памяти....

Дописать конструктор и деструктор для класса
Помогите пожалуйста написать конструктор копии и деструктор, а также вызвать их, чтобы деструктор выводил на экран &quot;работает&quot; ...

Для класса задать конструктор и деструктор
Ребята,нужна помощь в написании программы. Для класса задать конструктор(для выделения памяти,открытия файлов,задания начальных значений...

Конструктор (деструктор) у класса, не имеющего тип
Можно ли объявить и определить конструктор у класса, который не имеет тип? То есть у меня в программе всего 1 экземпляр этого класса,...

Создание класса с перегрузкой операторов конструктор и деструктор
Создать класс времени (Time) содержащий закрытую переменную-член хранящую целое значение времени интервала в секундах. Интерфейс класса...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Опции темы

Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru