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

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

29.06.2019, 12:03. Показов 20166. Ответов 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
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 11:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Предположим, один из конструкторов содержит полезный функционал.
конструктор не должен содержать какую то полезную логику кроме логики создания объекта, если есть какой то полезный функционал его нужно вывести в отдельные методы и уже эти методы вызывать в конструкторе или где то еще, где угодно.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 12:09
Цитата Сообщение от _stanislav Посмотреть сообщение
если есть какой то полезный функционал его нужно вывести в отдельные методы и уже эти методы вызывать в конструкторе
Конструкторы не должны ни кому ни чего. Но наличие "полезной вне создания объекта" логики в конструкторе, это не очень удачная идея, согласен. И об этом уже говорилось. А вот вызов такого рода "полезных" методов в конструкторе ни чем не лучше. Любое исключение в конструкторе ведёт к прерыванию создания объекта и это значит, что функция бросившая исключение должна позаботиться о том, чтобы освободить ресурсы, потому что деструктор не будет вызван автоматически (для автоматических объектов) при выходе из области. Ещё хуже то, что в общем случае, нужно иметь информацию о том, какие ресурсы захвачены а какие нет на момент исключения, чтобы не вызвать крэш освобождением того, чего не нужно. Это должна быть очень умная функция и очень умный обработчик исключения. То есть, одна головная боль. Но для любителей по извращаться - неисчерпаемая нива.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.06.2019, 14:13
IGPIGP,
Если полностью отработает хотя бы 1 конструктор (тот, которому делегировали), а основной (тот, который использован для создания экземпляра) пусть даже бросит исключение, то деструктор все же будет вызван...

Добавлено через 1 час 33 минуты
С телефона был, пример кода не смог привести.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
 
class Foo
{
public:
    Foo(int c)
    {
        m_c = c;
    }
    Foo(int a, int b) : Foo(a + b)
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
        throw 123;
    }
    ~Foo()
    {
        std::cout << __PRETTY_FUNCTION__ << '\n';
    }
    
private:
    int m_a;
    int m_b;
    int m_c;
};
 
int main()
{
    try {
        Foo f(1, 2);
    } catch (int code) {
        std::cout << "Exception code: " << code;
    }
}
https://rextester.com/UUIAQ12396
Цитата Сообщение от IGPIGP Посмотреть сообщение
Любое исключение в конструкторе ведёт к прерыванию создания объекта и это значит, что функция бросившая исключение должна позаботиться о том, чтобы освободить ресурсы, потому что деструктор не будет вызван автоматически (для автоматических объектов) при выходе из области.
Как можно заметить, все не так однозначно...
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 14:26
Цитата Сообщение от Undisputed Посмотреть сообщение
IGPIGP,
Если полностью отработает хотя бы 1 конструктор (тот, которому делегировали), а основной (тот, который использован для создания экземпляра) пусть даже бросит исключение, то деструктор все же будет вызван...
Undisputed, речь не шла о делегировании и очередности вызовов. Хотя это отдельная тема и там не всё гладко. Очень мягко говоря. Речь шла о фразе:
Цитата Сообщение от hoggy Посмотреть сообщение
деструктор можно вызвать как обычный метод.
и вопросе на неё:
И такой вызов уничтожает объект?
Цитата Сообщение от Artem_Pv Посмотреть сообщение
И такой вызов уничтожает объект?
Ответ очевиден - да уничтожит (деинициализирует). Но мы имеем ряд ответов от достаточно опытных участников, которые отличаются от данного. Это тоже интересный пример для новичка, который говорит о том, что всего знать невозможно и о том, что практика сильнее теории. На практике.

Добавлено через 5 минут
Цитата Сообщение от Undisputed Посмотреть сообщение
Как можно заметить, все не так однозначно...
В сложных областях однозначность возможна в книге из 100500 однозначных выводов для 100500 однозначных случаев. Ваш пример показывает случай когда делегирование спасает от неприятностей. А представьте себе что после вызова конструктора - делегата, основной конструктор выделил память и бросил исключение.
Исключения из правил, это правила, как правило. Но это совершенно не касается исключений в С++. За редким исключением.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 14:28
Цитата Сообщение от IGPIGP Посмотреть сообщение
Конструкторы не должны ни кому ни чего.
согласен, долг в данном контексте не уместен (вообще понятие должен я не понимаю, употребил спонтанно.). По этому поправлю, что обычные конструкторы придумали для того что бы реализовать логику конструирования объекта, и по этому их настоятельно рекомендуется использовать по их прямому назначению.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.06.2019, 14:29
Цитата Сообщение от IGPIGP Посмотреть сообщение
Ваш пример показывает случай когда делегирование спасает от неприятностей.
Нет )) Мой пример показывает что
Цитата Сообщение от IGPIGP Посмотреть сообщение
отому что деструктор не будет вызван автоматически (для автоматических объектов)
не всегда == true
больше этим я ничего сказать не хотел
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 14:48
_stanislav, мне вспомнился очень интересный момент из Г. Саттера "Решение сложных задач на С++" Москва-СПБ-Киев 2002.
Там в главе 9 Ловушки, ошибки и антиидиомы. стр.337; есть размышле5ния о том, нужна ли проверка на само-присваивание в операторе присваивания. Делается вывод о том, что трюк с swap (известный и остроумный) позволяет безопасно проводить даже само-присваивание (с небольшими накладными расходами). А потом продолжается вопрос, а нужно ли проверять само-присваивание само-конструирование в конструкторе копий. И он делает вывод что не обязательно, так как объекта ещё нет. А чуть позже приводит припер (мелкими буквами в сноске от автора) о том, что в случаях:
C++
1
2
T t;
new(&t)T(t);
и
C++
1
T t=t;
поведение не определено. Но в силу искусственности примеров, проверка не нужна.
Я думаю, что в результате дискуссии мы нашли совершенно убедительное подтверждение того, что кроме UB тут возможны гораздо более тяжкие последствия:
C++
1
2
3
T t;
t.~();
new(&t)T(t);
и в этом польза дискуссий. Все делают полезное дело и правые и не правые оппоненты. А мусор вроде "бомбящий" wtf - накладные расходы. Это можно пережить.

Добавлено через 3 минуты
Цитата Сообщение от Undisputed Посмотреть сообщение
не всегда == true
Undisputed, я написал о том, что всегда true и однозначно - в книге на 100500 true. И в стране вечной линковки. В реальной жизни - куча опечаток и в книгах на 100500 страниц. И не только опечаток, а и просто не верных утверждений. Но всё равно спасибо. Может кому-то нужно именно то, о чём вы написали.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 14:55
IGPIGP, мне кажутся эти конструкции (которые ты привел) не здоровыми, страшными. не знаю может ли это понадобиться в быту, лично меня они пугают и я скорее всего так бы не писал.
Цитата Сообщение от IGPIGP Посмотреть сообщение
мне вспомнился очень интересный момент
интересно почему тебе вспомнился этот момент?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 14:57
нкегнгенш
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 14:57
Цитата Сообщение от Artem_Pv Посмотреть сообщение
И такой вызов уничтожает объект?
нет.

деструктор только на словах "уничтожитель", а на деле - "уборщик".
чистит за объектом: освобождает дин. память, и тп.

сам объект при этом никуда не девается.
его даже можно использовать повторно:
https://rextester.com/KINF51884

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
 
int main()
{
    using string = std::string;
    
    std::string s = "hello,";
    std::cout << s;
    
    s.~string(); // <--- после вызова деструктора, объект существует
    // --- но находится в некотором неконсистентном состоянии
    
    // --- ре-инициализируем объект
    // заново переинициализуются все его данные
    // и объект снова будет в согласованном состоянии
    new(&s) std::string(" world");
    std::cout << s << '\n';
}
важно понимать: объект - это просто кусок памяти.
что бы уничтожить объект, нужно удалить саму память.

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

статические объекты будут жить до конца программы.
а динамические - пока объекту явно не позовут delete.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 15:01
Цитата Сообщение от _stanislav Посмотреть сообщение
интересно почему тебе вспомнился этот момент?
Потому, что мы говорили о том, чего делать не стоит. Я не очень люблю такие разговоры. В любой области есть совсем немного разумных путей, в бесконечном многообразии не разумных. И всё же иной раз и такие разговоры наталкивают на интересные вещи.
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 15:02

Не по теме:

какая то перезагрузка в матрице (на форуме) случилась (дежавю), опять глюкануло.



Добавлено через 1 минуту
Цитата Сообщение от IGPIGP Посмотреть сообщение
в бесконечном многообразии не разумных
согласен, почему ни у кого не возникает вопроса, почему нельзя молотком по пальцам стучать?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 15:17
Цитата Сообщение от IGPIGP Посмотреть сообщение
нкегнгенш
Удалите пожалуйста, - не успел доредактировать.
Цитата Сообщение от _stanislav Посмотреть сообщение
согласен, почему ни у кого не возникает вопроса, почему нельзя молотком по пальцам стучать?
В том-то и дело что можно. Даже по своим. Хотя, излишне широкий взгляд может вызвать косоглазие. Это да. Вот сейчас - новая волна обсуждения. В чём её польза? С моей точки зрения, в том, что человеку новому в IT вообще и в С++ в частности, ещё не очевидно, что термины даже на английском, это не сильная сторона предмета. А уж по русски и тем паче. Разрушение объекта без зубила и молотка... Это трудная задача. А доводилось ли вам когда-либо видеть дико скачущую по подлунным пустошам память? После ея сердешной освобождения. А удаляли ли вы указатель? Без наркоза?
Хех... Даже хорошее понимание условности принятых терминов и контекста в котором они приняты не гарантирует сходности взглядов в обсуждении. Всегда можно не согласиться.
Но для новичка полезно понять, что слова - просто формальные обозначения того что за ними стоит. И не стоит искать этого в них самих (по обиходному значению, например), а нужно читать, пробовать и опять читать и пробовать.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
30.06.2019, 15:17
Цитата Сообщение от hoggy Посмотреть сообщение
важно понимать: объект - это просто кусок памяти.
важно понимать: это дурацкое определение объекта несколько лет как выпилили из стандарта.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 15:19
Цитата Сообщение от rat0r Посмотреть сообщение
выпилили из стандарта.
а какое впилили?
0
Неэпический
 Аватар для Croessmah
18146 / 10730 / 2066
Регистрация: 27.09.2012
Сообщений: 27,030
Записей в блоге: 1
30.06.2019, 15:25
Цитата Сообщение от _stanislav Посмотреть сообщение
а какое впилили?
Перепилили: http://eel.is/c++draft/intro.object
2
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
30.06.2019, 15:30
Цитата Сообщение от hoggy Посмотреть сообщение
// и объект снова будет в согласованном состоянии
вообще то время жизни этого объекта уже истекло
Цитата Сообщение от hoggy Посмотреть сообщение
s.~string();
когда был вызван деструктор
The lifetime of an object o of type T ends when:
(1.3) — if T is a class type with a non-trivial destructor (10.3.7), the destructor call starts, or
(1.4) — the storage which the object occupies is released, or is reused by an object that is not nested within o (6.6.2).
а эта штука
Цитата Сообщение от hoggy Посмотреть сообщение
new(&s) std::string(" world");
формирует новый объект
который никак не связан со старым
If, after the lifetime of an object has ended and before the storage which the object occupied is reused or released, a new object is created at the storage location which the original object occupied, a pointer that pointed to the original object, a reference that referred to the original object, or the name of the original object will automatically refer to the new object and, once the lifetime of the new object has started, can be used to manipulate the new object
Цитата Сообщение от hoggy Посмотреть сообщение
// и объект снова будет в согласованном состоянии
объект не будет снова в согласованном состоянии т.к время жизни его истекло при вызове деструктора
а использование просроченного объекта это UB.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
30.06.2019, 15:39
Цитата Сообщение от _stanislav Посмотреть сообщение
а какое впилили?
А есть разница в данном контексте? Тут же вопрос холиварный философский.
Триединая сущность
- объект отображающий объект внешнего мира (логический - абстракция уровня описания);
- объект программы как алгоритмическая единица;
- объект типа ( С++),
трепещет.
Пересоздать можно даже константный объект или тем паче, синглтон. Значит ли это, что это тот же объект если он пересоздан? Создание состоит в выделении и инициализации. Можно повторять вторую фазу (после деинициализации). Но до какой степени нужно разрушить дом, чтобы считать его разрушенным?
Это дело вкуса, как к этому относиться.
Когда-то в зимних лыжных походах, в плохих спортивных группах, тех участников, кто часто падал, старались ставить последними на лыжне. Это потому, что человек падая с рюкзаком, делал в лыжне лохань из которой мог выбраться не снимая рюкзак, только если он реально Геракл. Или его родственник. Зато тем кто бежит следом угодить в эту лохань гораздо легче. И с каждым объектом лохань увеличивается (в отличие от памяти в C++). У нас однажды была маленькая девчушка, которая неплохо стояла на лыжах, но когда падала в такую лохань, то приходилось её вытаскивать.
Вот так. Лохань - одна и та же, а объекты постоянно разные.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
30.06.2019, 15:47
Цитата Сообщение от Undisputed Посмотреть сообщение
формирует новый объект
это - тот же самый объект, Бро

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

тогда все равно имеем на руках "новый сформированный объект"

"новый сформированный объект" - это не "просроченный объект"

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


итого: никакого UB.

Добавлено через 1 минуту
Цитата Сообщение от rat0r Посмотреть сообщение
важно понимать: это дурацкое определение объекта несколько лет как выпилили из стандарта.
важно понимать,
что это "дурацкое определение" отражает суть происходящего в коде.
и эта суть не изменилась.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
30.06.2019, 15:52
Цитата Сообщение от hoggy Посмотреть сообщение
это дурацкое определение объекта
по мне так это самое правильное определение объекта если в двух словах.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.06.2019, 15:52
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru