Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/89: Рейтинг темы: голосов - 89, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144

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

29.06.2019, 12:03. Показов 20130. Ответов 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
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.06.2019, 15:57
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
даже если принять твой тезис выше,
это не мой тезис, я лишь ссылаюсь на стандарт
ты оперируешь только одним объектом string
а на деле здесь два объекта
старый объект + новый объект = 2 сущности
но ты использовал ту сущность чей лайфтайм истек

Цитата Сообщение от hoggy Посмотреть сообщение
итого: никакого UB
то что новый объект размещен в участке который был кем-то когда-то занят
еще не говорит что это тот же самый объект.

Допустим у нас есть два экземпляра разных классов:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
struct A
{
    int a;
};
 
struct B
{
    int a;
};
 
int main()
{
    A *obj1 = new A;
    delete obj1;
    
    B *obj2 = new B;
    std::cout << obj1 << '\n';
    std::cout << obj2 << '\n';
}
Если аллокатор для B выделит тот же участок памяти что и для A (имеет право, т.к этот участок на момент выделения памяти для B уже свободен), то по твоей логике в программе все равно будет один объект а не два... в одном же участке сидят
Кстати, сейчас протестировал - так и получилось. Для двух разных объектов был выдан один и тот же адрес.
0x2000c20
0x2000c20
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 16:00
Цитата Сообщение от _stanislav Посмотреть сообщение
по мне так это самое правильное определение объекта если в двух словах.
согласен.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 16:02
Undisputed, кстати согласен, если по одному и тому же адресу размещать вызывать 10 раз конструктор, то по одному и тому же адресу будет размещено по очереди 10 разных объектов (в смысле перезапишутся).
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 16:10
Цитата Сообщение от _stanislav Посмотреть сообщение
по мне так это самое правильное определение объекта если в двух словах.
там нет определения. Я согласен с
hoggy,
Цитата Сообщение от hoggy Посмотреть сообщение
это "дурацкое определение"
поскольку нет определения. Функционально-алгоритмические определения оправданы лишь если не существует возможности определить доотличительные части. У первобытных людей имена напоминали такие определения. Например: "Синий цветок, на утро после дождя, ожидающий пчелу, летящую с сообщением в формате TCPIP".
Ребята, которые пишут такое, - весёлые парни. Впрочем, выбора у нас нет.

Есть ещё кое-что. Б. Страуструп считает, что объект в программе это сущность которая имеет уникальный адрес. Если принять трактовку о пересоздании объектов как "новых" объектов по старым адресам, то суть меняется. Хотя для каждого момента и будут разные но уникальные объекты, на каждый момент времени (атомарность не затрагиваем), но ссылки инициализированные ранее будут связаны с разными объектами. Если это будет закреплено на уровне оптимизаций, язык может понести урон. Ну да, поживём - увидим.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 16:11
Цитата Сообщение от Undisputed Посмотреть сообщение
это не мой тезис, я лишь ссылаюсь на стандарт
ты прежде чем ссылаццо на стандарт,
вникай немножко в то, что там написано.

Цитата Сообщение от Undisputed Посмотреть сообщение
а на деле здесь два объекта
старый объект + новый объект = 2 сущности
но ты использовал ту сущность чей лайфтайм истек
ты пьяный что ли?

тебе показать как на практике выглядит "использование сущность чей лафтайм истек"?

C++
1
2
obj.~some();
obj.work(); // <--- UB. obj в несогласованном состоянии
Цитата Сообщение от Undisputed Посмотреть сообщение
то что новый объект размещен в участке который был кем-то когда-то занят
еще не говорит что это тот же самый объект.
конечно не говорит.
если по адресу Пети ты разместил Васю,
то очевидно жеж, что теперь там живет Вася.

но если по некоторому адресу Пети,
ты разместил Петю,
то внезапно там живёт тот же самый Петя.

И если Вася воскресил Петю, а тебе не сказал,
то ты не просто не заметишь никакой разницы между прежним Петей и воскрешенным.
у тебя в принципе нет,
и не может быть никаких способов,
как догадаться,
что это уже - новый Петя.

самое главное, что с практической точки зрения, это совершенно не важно.
новый Петя абсолютно ничем не отличается от прежнего.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 16:17
Цитата Сообщение от hoggy Посмотреть сообщение
конечно не говорит.
если по адресу Пети ты разместил Васю,
то очевидно жеж, что теперь там живет Вася.
но если по некоторому адресу Пети,
ты разместил Петю,
то внезапно там живёт тот же самый Петя.
И если Вася воскресил Петю, а тебе не сказал,
то ты не просто не заметишь никакой разницы между прежним Петей и воскрешенным.
у тебя в принципе нет,
и не может быть никаких способов,
как догадаться,
что это уже - новый Петя.
самое главное, что с практической точки зрения, это совершенно не важно.
новый Петя абсолютно ничем не отличается от прежнего.
у меня дежавю? кто знает тот поймет, надеюсь.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 16:19
Цитата Сообщение от IGPIGP Посмотреть сообщение
там нет определения.
"Объект – это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл знчения, обнаруженного в объекте, определяется типом имени, ипользованного для доступа к нему."
(c) Бьярн Струатруп.
Справочное руководство по C++.
---
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
30.06.2019, 16:23
_stanislav, нет, не дежавю. Мы это уже проходили.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.06.2019, 16:23
Цитата Сообщение от hoggy Посмотреть сообщение
ты прежде чем ссылаццо на стандарт,
вникай немножко в то, что там написано.
ну разъясни тогда этот стандарт, если я его некорректно понял.
Цитата Сообщение от hoggy Посмотреть сообщение
тебе показать как на практике выглядит "использование сущность чей лафтайм истек"?
мы обсуждаем конкретный пример (твой)

Что касается Вась и Петь думаю это просто твои фантазии, не более
В С++ же нет такого понятия как "воскресил".
И пример кстати не удачный.

Есть два одинаковых компьютера
Один находится в комнате потом его забирают на свалку
И ставят на его место второй
Это же не значит что это тот же самый компьютер
Пусть даже если параметры у них 1 в 1
Это два разных компьютера
Считай new - это команда собрать компьютер.
Да, такого же типа, но уже второй...
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
30.06.2019, 16:24
hoggy, а год издания руководства какой?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 16:52
Цитата Сообщение от Undisputed Посмотреть сообщение
ну разъясни тогда этот стандарт, если я его некорректно понял.
там все просто:
вызвал деструктор, объект считается недействительным.

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

но это не значит, что сам кусок памяти теперь радиоактивен,
и им в принципе нельзя пользоваться.

создай по этому же адресу любой объект,
и используй его на здоровье.


Цитата Сообщение от Undisputed Посмотреть сообщение
мы обсуждаем конкретный пример (твой)
в моём конкретном примере всё ок.

Петя у меня там как Исскус Христос.
сначала его убивают (зовут деструктор)
а потом воскрешают (зовут new placement)


Цитата Сообщение от Undisputed Посмотреть сообщение
И ставят на его место второй
Это же не значит что это тот же самый компьютер
Пусть даже если параметры у них 1 в 1
тебе нужно понять ровно две вещи:

1.
понять, когда объект сдох (им нельзя пользоваться),
а когда он живой (можно пользоваться)
что бы ты не трактовал корректный код как UB

2.
понять, что если по некоторому адресу жил Петя,
и вот прямо сейчас там тоже живет Петя,
то совершенно не важно: это уже новый Петя, или старый.

на практике (для всего вызывающего кода) это просто Петя.

назови его "новым Петей", и что изменится от этого?
ничего.

ты сейчас занимаешься словоблудием.
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,029
Записей в блоге: 1
30.06.2019, 16:54
Цитата Сообщение от hoggy Посмотреть сообщение
ты сейчас занимаешься словоблудием.
Сказал hoggy перед зеркалом.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.06.2019, 17:07
Цитата Сообщение от hoggy Посмотреть сообщение
вызвал деструктор, объект считается недействительным.
а я разве не об этом говорил?
Цитата Сообщение от hoggy Посмотреть сообщение
почему недействительным?
потому что деструктор зачистил все ресурсы, которые нужны классу для работу.
без этих ресурсов корректная работа попросту невозможна.
ну во первых не классу а экземпляру класса
во вторых причины на самом деле в данном случае не важны
важен сам факт что объект уже просрочен и пользоваться им уже нельзя
Цитата Сообщение от hoggy Посмотреть сообщение
но это не значит, что сам кусок памяти теперь радиоактивен,
и им в принципе нельзя пользоваться.
что кусок памяти радиоактивен я тоже не утверждал
там можно размещать объект но это уже будет новый объект а не тот что был там прежде
Цитата Сообщение от hoggy Посмотреть сообщение
создай по этому же адресу любой объект,
и используй его на здоровье.
бинго!
создай/размести объект по этому адресу, но не "воскреси" прежний объект...
Цитата Сообщение от hoggy Посмотреть сообщение
Петя у меня там как Исскус Христос.
сначала его убивают (зовут деструктор)
а потом воскрешают (зовут new placement)
Если что, Иисус не был убит, и я это даже могу обосновать почему это утверждение не логично
Но мы сейчас говорим о С++, а не о религии...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 17:08
Цитата Сообщение от hoggy Посмотреть сообщение
"Объект – это область памяти. Объект имеет класс памяти, определяющий его время жизни. Смысл знчения, обнаруженного в объекте, определяется типом имени, ипользованного для доступа к нему."
(c) Бьярн Струатруп.
Справочное руководство по C++.
Я говорил о ссылке на черновик. Что касается Б. Страуструпа, то о его понимании объекта (так как мне удалось понять) я написал и оно соответствует вашей цитате. Вообще, в данном топике ваша точка зрения ближе всех к моей. Но похоже вы решили всех победить. Побеждайте. Я не против.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 18:41
Цитата Сообщение от Undisputed Посмотреть сообщение
а я разве не об этом говорил?
ты писал, что код содержит UB

Цитата Сообщение от Undisputed Посмотреть сообщение
ну во первых не классу а экземпляру класса
ты опять занимаешься словоблудием.

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

Цитата Сообщение от Undisputed Посмотреть сообщение
во вторых причины на самом деле в данном случае не важны
важен сам факт что объект уже просрочен и пользоваться им уже нельзя
если под "данным случаем" ты подразумеваешь мой код,
тогда важным тебе для тебя должен был оказаться тот факт,
что объект вполне себе можно переинициализировать и реюзать.

ты уловил сей очевидный момент?
Цитата Сообщение от Undisputed Посмотреть сообщение
там можно размещать объект но это уже будет новый объект а не тот что был там прежде
идентичность объекта определяется двумя параметрами: адресом, и типом,
который определяет смысл содержимого памяти.

если адрес и тип не изменились,
значит это - тот же самый объект.

ты, конечно, можешь считать,
что разместил по старому адресу новый объект такого же типа,
о чем я уже не однократно сообщал тебе выше,
суть от этого не изменится.

с технической точки зрения - это все тот же самый объект.

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

Цитата Сообщение от Undisputed Посмотреть сообщение
бинго!
создай/размести объект по этому адресу, но не "воскреси" прежний объект...

нет, не бинго.
между "создать объект такого же типа по прежнему же адресу"
и "воскресить объект" нет никакой разницы.

ты же пишешь об этом так, словно есть какая то принципиальное различие.
в чем различие, ты объяснить конечно не сможешь.
0
 Аватар для Fulcrum_013
2083 / 1575 / 169
Регистрация: 14.12.2014
Сообщений: 13,614
30.06.2019, 18:50
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Вроде, у Страуструпа написано, что конструктор НЕ создает объект, а лишь инициирует его поля.
Хотелось бы разобраться.
Тут все просто. Просто стоит отличать буфер объекта (кусок занимаемой им памяти) от инстанса (экземпляра класса) который в этом буфере живет. И тогда все легко и понятно.
Конструктор не создает буфер объекта. О инициализирует инстанс - т.е. только инициализирует значения в уже созданном и переданном ему буфере.
Точно так же деструктор не уничтожает буфер. Он только разрушает инстанс - т.е. приводит объект в состояние безопасное для уничтожения буфера или переиспользования его другим инстансом.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 19:06
Цитата Сообщение от hoggy Посмотреть сообщение
идентичность объекта определяется двумя параметрами: адресом, и типом
а как же адреса и ссылки которые содержал объект (вообще конструкторы могут быть разные и инварианты тоже), они же не всегда могут быть одинаковые между двумя вызовами конструктора?
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 21:21
del
0
Отпрыск ChatGPT
 Аватар для Azawa
33 / 29 / 4
Регистрация: 18.06.2019
Сообщений: 152
30.06.2019, 22:06
_stanislav, вот это правильно, лучше всегда заново вызывать конструктор чтобы обновить ссылки и указатели. Вообще не понимаю о чем спор, использовать оставшийся в памяти призрак деструктированного объекта в любом случае плохо.
0
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,365
30.06.2019, 22:06
Цитата Сообщение от Fulcrum_013 Посмотреть сообщение
Тут все просто.
ога... только вот кто вам разрешит напрямую распоряжаться памятью? это же ось на этом уровне командует парадом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.06.2019, 22:06
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru