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

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

29.06.2019, 12:03. Показов 20193. Ответов 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
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,375
29.06.2019, 12:11
а зачем? вызывая конструктор вы создаете объект, который потом уничтожит деструктор создавать объекты можно в любом месте
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 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
9007 / 4708 / 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
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,375
29.06.2019, 13:25
Цитата Сообщение от Artem_Pv Посмотреть сообщение
у Страуструпа написано, что конструктор НЕ создает объект, а лишь инициирует его поля.
потому что нет никаких объектов. и полей никаких нет. есть область в памяти, на которую тебе дается ссылка при вызове конструктора. вот называй ее объектом
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 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
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,375
29.06.2019, 13:56
Цитата Сообщение от Artem_Pv Посмотреть сообщение
// здесь создается объект
открой книжки по с++
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
29.06.2019, 14:02
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Это корректно?
Нет.
Цитата Сообщение от Artem_Pv Посмотреть сообщение
здесь создается объект
Нет.
1
 Аватар для vlisp
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,375
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
1064 / 985 / 153
Регистрация: 10.08.2015
Сообщений: 5,375
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
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
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
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки 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. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru