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

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

29.06.2019, 12:03. Показов 19934. Ответов 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
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,347
29.06.2019, 12:11
а зачем? вызывая конструктор вы создаете объект, который потом уничтожит деструктор создавать объекты можно в любом месте
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.06.2019, 12:20
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Можно ли Конструктор и Деструктор вызывать как метод класса?
Они так и вызываются. Иначе их не вызовешь. Разве что, конструктор можно без полной квалификации вызывать.
А если говорить о методе экземпляра, то:
конструктор нельзя, а деструктор можно.
Это потому, что методы вызываются на объектах, а при вызове конструктора ещё нет объекта. Для порождения объекта объектом пишут методы (которые обычно используют конструктора), такие как Clone и пр.
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
29.06.2019, 12:37  [ТС]
Цитата Сообщение от vlisp Посмотреть сообщение
вызывая конструктор вы создаете объект,
Пожалуйста, поясните.
Вроде, у Страуструпа написано, что конструктор НЕ создает объект, а лишь инициирует его поля.
Хотелось бы разобраться.
Заранее спасибо.

Добавлено через 6 минут
Спасибо что ответили.

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

Добавлено через 4 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
при вызове конструктора ещё нет объекта.
Речь идет, когда объект уже создан (один из его конструкоров отработал).
Вопрос: Далее(имея объект), можно ли конструкторы вызывать как обычные методы?

P.S.
Извиняюсь, я сразу не объснил ситуацию. Моя ошибка.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.06.2019, 12:41
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Пожалуйста, поясните на примере.
C++
1
2
3
4
struct A{}
///////////
A::A();
Foo(A::A(a,b,c);
Это возможно, хотя и излишество. Я написал об этом, что бы вы поняли, что конструктор это метод класса. Именно поэтому он вызывается как метод класса.
Цитата Сообщение от Artem_Pv Посмотреть сообщение
после того, как уже объект создан, как вручную вызвать этот конструктор
Вы создадите новый объект и от этого ни куда не деться.
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Предположим, один из конструкторов содержит полезный функционал.
В принципе, это возможно как для конструкторов, так и для деструкторов. Однако, не применяется широко из-за того, что серьёзный функционал трудно создать без возможности генерации исключений. Для конструкторов это не великая радость, а для деструкторов исключения недопустимы.
1
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,347
29.06.2019, 13:25
Цитата Сообщение от Artem_Pv Посмотреть сообщение
у Страуструпа написано, что конструктор НЕ создает объект, а лишь инициирует его поля.
потому что нет никаких объектов. и полей никаких нет. есть область в памяти, на которую тебе дается ссылка при вызове конструктора. вот называй ее объектом
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9005 / 4706 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
29.06.2019, 13:45
Цитата Сообщение от Artem_Pv Посмотреть сообщение
у Страуструпа написано, что конструктор НЕ создает объект, а лишь инициирует его поля
Вообще, это можно по разному сформулировать. Страуструп имеет приоритет и авторитет вне обсуждений. Однако, создание, это процесс, а конструктор это чертёж. Конечно чертёж не создаёт. Система создаёт. Для размещающего new это видно явно:
C++
1
2
void * ptr = new char[sizeof(MyClass)];//выделяем
MyClass * myClassPtr=new(ptr) MyClass;// инициализируем
мы пахали - я и компилятор.
На стеке объект создаётся так, что фаза выделения не видна. Но в целом, объект создаётся механизмами программно-аппаратного комплекса и представляет собой набор зарядов в полупроводниковом наборе ячеек.
Ни кто не может сказать, что Б. Страуструп не прав. -Прав.
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
29.06.2019, 13:45  [ТС]
Цитата Сообщение от IGPIGP Посмотреть сообщение
Вы создадите новый объект и от этого ни куда не деться.
Пожалуйста, проверьте пример:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class my_Class   
{
public:
   my_Class()
     { cout << "Работает конструктор"; }
};
 
int main()
{
   my_Class o_Class();  // здесь создается объект
 
   o_Class.my_Class();  // у созданного объекта(o_Class) запускаем конструктор(как обычный метод). 
                         // Это корректно? 
                         // Второй объект не создается?
}
0
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,347
29.06.2019, 13:56
Цитата Сообщение от Artem_Pv Посмотреть сообщение
// здесь создается объект
открой книжки по с++
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.06.2019, 14:02
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Это корректно?
Нет.
Цитата Сообщение от Artem_Pv Посмотреть сообщение
здесь создается объект
Нет.
1
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,347
29.06.2019, 14:09
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
#include <iostream>
 
class my_Class   
{
public:
    my_Class() { std::cout << "Работает конструктор\n"; }
   ~my_Class() { std::cout << "Работает деструктор\n";    }
public:    
    void my_metod () { std::cout << "Работает метод\n"; }
 
};
 
int main()
{
   my_Class* o1_Class = new my_Class();  // здесь создается указатель на первый объект
 
   o1_Class->my_metod();  
 
    delete o1_Class;
    
    my_Class o2_Class = my_Class();  // здесь создается объект
    o2_Class.my_metod();
    // тут неявно вызывается деструктор для второго объекта
}
1
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.06.2019, 14:09
Лучший ответ Сообщение было отмечено Artem_Pv как решение

Решение

Цитата Сообщение от Artem_Pv Посмотреть сообщение
И после того, как уже объект создан, как вручную вызвать этот конструктор, чтоб он отработал как обычный метод класса?
После того как уже создан - никак. В C++11 можно вызывать один конструктор из другого в списке его инициализации. Попадает это под ваш вопрос или нет - не знаю, но как обычный метод точно нигде и никогда его вызывать нельзя.
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
29.06.2019, 15:29  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
После того как уже создан - никак.
Теперь все понятно. Спасибо.

P.S.
в некоторых "других" языках программирования Конструкторы и Деструкторы, дополнительно выступают в роли методов класса. Например, в Конструкторе инициируются поля класса, это же полезный функционал, чтоб использовать его повторно, не создавая новый метод Clear;
Жаль...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.06.2019, 15:36
Цитата Сообщение от Artem_Pv Посмотреть сообщение
в некоторых "других" языках программирования Конструкторы и Деструкторы, дополнительно выступают в роли методов класса. Например, в Конструкторе инициируются поля класса, это же полезный функционал, чтоб использовать его повторно, не создавая новый метод Clear;
1.
что тебе мешает сделать метод init,
который ты можешь вызвать как из конструктора,
для собственно, инициализации,
так и просто - как обычный метод?

2.
деструктор можно вызвать как обычный метод.
1
 Аватар для vlisp
1063 / 984 / 153
Регистрация: 10.08.2015
Сообщений: 5,347
29.06.2019, 15:41
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Например, в Конструкторе инициируются поля класса, это же полезный функционал, чтоб использовать его повторно, не создавая новый метод Clear;
у вас мозги поплыли...
если надо реинициализировать поля, создайте метод для этого и не парьтесь! впрочем это геморррой. по сути нужно дублировать поля и восстанавливать из дубликатов состояние с помощью метода, который может даже ничего не возвращать
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
29.06.2019, 15:50  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
В C++11 можно вызывать один конструктор из другого в списке его инициализации
Еще хотел узнать:
Как управлять очередностью вызова родительского конструктора?

Например, требуется, чтобы сначала отработал функционал дочернего конструктора, а затем родительского.
Такое возможно?

Добавлено через 7 минут
Цитата Сообщение от hoggy Посмотреть сообщение
2. деструктор можно вызвать как обычный метод.
И такой вызов уничтожает объект?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
29.06.2019, 15:59
Цитата Сообщение от Artem_Pv Посмотреть сообщение
И такой вызов уничтожает объект?
Такой вызов может призвести к UB, для автоматически выделенных объектов или при попытке доступа к объекту после этого.
По-этому, вам пока лучше не стоит этого делать.
0
19491 / 10097 / 2460
Регистрация: 30.01.2014
Сообщений: 17,805
29.06.2019, 16:12
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Жаль...
Не о чем тут жалеть. Со временем вы поймете, что так, как конструкторы сделаны в С++, - это одно и лучших решений.

Цитата Сообщение от Artem_Pv Посмотреть сообщение
требуется, чтобы сначала отработал функционал дочернего конструктора, а затем родительского.
Зачем это может понадобиться? Уточните задачу.
Если понимать вас буквально, то нет, такое невозможно и нарушает здравый смысл.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
29.06.2019, 16:42
Цитата Сообщение от DrOffset Посмотреть сообщение
Со временем вы поймете, что так, как конструкторы сделаны в С++
а как они устроены?
вроде кусок кода
который вызывается при создании объекта
либо джамп на адрес если не инлайн
либо встроенный кусок
что делает решение относительно конструкторов в С++ каким то особенным? )
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
29.06.2019, 17:13
del
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.06.2019, 17:13
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru