Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/15: Рейтинг темы: голосов - 15, средняя оценка - 5.00
#define книжный_червь Я
 Аватар для ][акер
185 / 96 / 21
Регистрация: 30.01.2010
Сообщений: 780

Вызывается деструктор когда обьект не уничтожен!

03.05.2010, 20:41. Показов 3278. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
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
34
35
36
37
38
39
40
41
42
#include "stdafx.h"
#include <iostream>
#include <conio.h>
 
using namespace std;
 
class inkr {
private:
    int a;
public:
    inkr(int b): a(b) {}
    ~inkr()
    {
        cout << "И помните! Этот класс написал Григорий Сабинин!\n";
        _getch();
    }
    int operator++()
    {
        a--;
        return a;
    }
    int operator--()
    {
        a++;
        return a;
    }
    void show()
    {
        cout << a << endl;
    }
};
 
int main()
{
    setlocale(LC_ALL,"");
    inkr a = 8,b = 2;
    --b;
    b.show(); // После этого вызывается деструктор! :(
    a = ++a + --b;
    a.show();
    _getch();
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.05.2010, 20:41
Ответы с готовыми решениями:

Когда вызывается деструктор класса?
Вопрос собственно в том, когда происходит освобождение памяти, занимаемой объектом класса? Допустим имеем #include &lt;iostream&gt; ...

При создании класса конструктор вызывается 2 раза, затем вызывается деструктор о_О
Вот такой кодclass A { public: A(){} virtual ~A(){} }; class C { public:

Не вызывается деструктор
_Здравствуйте. Я новичок в программировании, сейчас изучаю самостоятельно С++ по книге Джесса Либерти. При разборе одного из примеров...

16
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:04
[акер;702689]cout << "И помните! Этот класс написал Григорий Сабинин!\n";
если вместо бесполезной строчки вставить это:
C++
1
cout << a << " - deleted" << endl;
всё встанет на свои места

вывод программы (комментарии мои):
C++
1
2
3
4
5
3 // b.show();
11 - deleted // a = ++a + --b;
11 // a.show();
4 - deleted // удаление b при выходе
11 - deleted // удаление a при выходе
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 21:11
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream> 
using namespace std;
class inkr {
private:
        int a;
public:
        inkr(int b): a(b) {}
        ~inkr()
        {
                cout << "destroy\n";
    
        }
 
        inkr& operator++()
        {
                a++;
                return *this;
        }
        inkr& operator--()
        {
                a--;
                return *this;
        }
 
        void show()
        {
                cout << a << '\n';
        }
 
 
inkr operator + (inkr& ptr){
        inkr tmp(*this);
        tmp.a+=ptr.a;
        return tmp; 
        }
};
 
int main()
{
       
        inkr a = 8, b = 2;
        --b;
 
        b.show(); 
        a = ++a + --b;
        a.show();
 
  return 0;
}
В операции + вызывается деструктор, и в операции присваивания вызывается деструктор,
и два деструктора в конце работы main.
Больше ни чего особенного нет.
Я даже не понимаю как ваш пример запустился без определения операции +
0
#define книжный_червь Я
 Аватар для ][акер
185 / 96 / 21
Регистрация: 30.01.2010
Сообщений: 780
03.05.2010, 21:11  [ТС]
А я чё то не понял! При передаче нового значения обьекту вызывается деструктор?
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 21:31
операции присваивания вызывается деструктор,
Не то ляпнул, не из-за операции присваивания, только из-за +

Добавлено через 2 минуты
Просто в операции + два конструктора == два деструктора .

Добавлено через 5 минут
И вообще a = ++a + --b; составное выражение.
Второй деструктор будет вызван после того как операция присваивания поработает с объектом
который вернулся из +
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:38
Genius Ignat, операция "+" с объектами ничего не делает

a = ++a + --b; -> a = 7 + 4; -> a = 11;
деструктор вызывается при попытке присвоить число - вызывается контсруктор inkr(int b)

C++
1
2
3
4
5
6
7
8
9
10
11
12
int main()
{
        inkr a = 8;
        a = 11;
        a.show();
        _getch();
}
 
вывод:
11 - deleted
11
11 - deleted
1
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 21:47
Roma_F:
Я работаю со свои примером и анализирую его, и мой пример верен, и анализ правильный.
В Философию программы: которую написал ][акер, вникать не хочется,
просто не понял, что этим он хотел сказать.

Добавлено через 2 минуты
Я даже не понимаю как ваш пример запустился без определения операции +
Это я понимаю, но зачем было затевать оболочку int когда работаешь не так как этого требует
смысл оболочки.
0
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
03.05.2010, 21:48
не переопределена операция сложения двух объектов.
operator + переопредели и все должно сработать
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:48
Genius Ignat, ааа, не обратил внимание что у тебя свой код
думал ты процитировал верхний
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 21:51
Iworb:
Дело даже не в этом, ты посмотри что возвращают операции ++ и -- они возвращают int
а для int + определен автоматически.
0
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
03.05.2010, 21:55
[акер;702689]int operator--()
{
a++;
return a;
}
затем вы вызываете --b
по схеме переопределенный оператор возвращает тип int, следовательно он откуда-то его получает и куда-то отдает. --b - получает из b, а возвращает куда? насколько я помню оператор должен быть того же класса, что и объект и возвращать также объект.

Добавлено через 1 минуту
ах да, они еще должны принимать объект класса..... Для инкриментных - один, для декриментых - два...
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 21:57
Iworb:
Махинации с возвратом объектов операциями ++ -- типа не класс,
допустимы, и почему стандарт над этим не поработает, просто это бессмысленно, прокачивать
int когда твоя оболочка и так int.
0
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
03.05.2010, 21:58
C++
1
2
3
4
int Get_a() {return a;}
void Set_a(int newa) {a=newa; return;}
inkr operator++(inkr&c)
{ a=Set_a(Get_a()-1); return c;}
мне кажется так будет правильно. Или я ошибаюсь?
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 22:01
принимать объект класса..... Для инкриментных - один, для декриментых - два...
Принимать объект не надо, потому как объект сам вызывает операцию ++ или -- .

Добавлено через 1 минуту
Объект сам работает со своими данными, и поэтому ни каких посредников для операции не надо.
0
анимешник++
 Аватар для Iworb
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
03.05.2010, 22:08
C++
1
2
3
4
5
nt operator--()
{
a++;
return a;
}
Раз так, то смысл в этой функции? Раз она работает с элементами класса, то ей ненужно ничего возвращать, если же там должен быть тип int, то при вызове ++b возвращается тип int и записывается в переменную b, которая является переменной типа inkr, поэтому я и говорю, что возвращать нужно объект. Я понимаю, что объект состоит только из одного целочисленного значения, но все-равно чувствую тут подвох =/
0
#define книжный_червь Я
 Аватар для ][акер
185 / 96 / 21
Регистрация: 30.01.2010
Сообщений: 780
03.05.2010, 22:09  [ТС]
Я кажется понял! При операции присваивания вызывается в начале деструктор, а потом и конструктор?
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 22:27
[акер;702968]При операции присваивания вызывается в начале деструктор, а потом и конструктор?
Как я понимаю: когда объкту inkr присваивается число - происходит скрытый вызов "конструктора преобразования", в данном случае inkr(int). Создаётся временный объект и копируется в исходный.
по стадиям:
C++
1
2
3
a = 11;
a = x(11);
a = x;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.05.2010, 22:27
Помогаю со студенческими работами здесь

Деструктор не вызывается
В одном классе я создаю объект, и если проверку не проходит, я его возвращаю в другой метод, дабы у меня там начало всех начал,Главное...

Не вызывается деструктор
#include &lt;iostream&gt; using namespace std; class myclass { int a; public: myclass(); // конструктор ~myclass(); //...

Не вызывается деструктор
Не вызывается деструктор дочерних окон, когда у главной всё работает: //дескриптор дочерней формы Form::~Form() { delete...

Не вызывается деструктор
Добрый день! Подскажите, пожалуйста, как быть... Есть программа: int main() { MyClass obj; obj.start(); ...

Деструктор не вызывается автоматом
В общем вопрос таков. Есть обычный класс, который ничего не наследует, в нем есть деструктор. в деструкторе у меня &quot;qDebug()...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
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
/ * Дана цепь постоянного тока с 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 из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru