#define книжный_червь Я
185 / 96 / 21
Регистрация: 30.01.2010
Сообщений: 780
1

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

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

Author24 — интернет-сервис помощи студентам
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2010, 20:41
Ответы с готовыми решениями:

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

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

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

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

16
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:04 2
[акер;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 3
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  [ТС] 4
А я чё то не понял! При передаче нового значения обьекту вызывается деструктор?
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 21:31 5
операции присваивания вызывается деструктор,
Не то ляпнул, не из-за операции присваивания, только из-за +

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

Добавлено через 5 минут
И вообще a = ++a + --b; составное выражение.
Второй деструктор будет вызван после того как операция присваивания поработает с объектом
который вернулся из +
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:38 6
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 7
Roma_F:
Я работаю со свои примером и анализирую его, и мой пример верен, и анализ правильный.
В Философию программы: которую написал ][акер, вникать не хочется,
просто не понял, что этим он хотел сказать.

Добавлено через 2 минуты
Я даже не понимаю как ваш пример запустился без определения операции +
Это я понимаю, но зачем было затевать оболочку int когда работаешь не так как этого требует
смысл оболочки.
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
03.05.2010, 21:48 8
не переопределена операция сложения двух объектов.
operator + переопредели и все должно сработать
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:48 9
Genius Ignat, ааа, не обратил внимание что у тебя свой код
думал ты процитировал верхний
0
1261 / 799 / 108
Регистрация: 16.09.2009
Сообщений: 2,010
03.05.2010, 21:51 10
Iworb:
Дело даже не в этом, ты посмотри что возвращают операции ++ и -- они возвращают int
а для int + определен автоматически.
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
03.05.2010, 21:55 11
[акер;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 12
Iworb:
Махинации с возвратом объектов операциями ++ -- типа не класс,
допустимы, и почему стандарт над этим не поработает, просто это бессмысленно, прокачивать
int когда твоя оболочка и так int.
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
03.05.2010, 21:58 13
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 14
принимать объект класса..... Для инкриментных - один, для декриментых - два...
Принимать объект не надо, потому как объект сам вызывает операцию ++ или -- .

Добавлено через 1 минуту
Объект сам работает со своими данными, и поэтому ни каких посредников для операции не надо.
0
анимешник++
95 / 62 / 7
Регистрация: 03.11.2009
Сообщений: 427
03.05.2010, 22:08 15
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  [ТС] 16
Я кажется понял! При операции присваивания вызывается в начале деструктор, а потом и конструктор?
0
332 / 247 / 32
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 22:27 17
[акер;702968]При операции присваивания вызывается в начале деструктор, а потом и конструктор?
Как я понимаю: когда объкту inkr присваивается число - происходит скрытый вызов "конструктора преобразования", в данном случае inkr(int). Создаётся временный объект и копируется в исходный.
по стадиям:
C++
1
2
3
a = 11;
a = x(11);
a = x;
0
03.05.2010, 22:27
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2010, 22:27
Помогаю со студенческими работами здесь

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

Не вызывается деструктор
Не вызывается деструктор дочерних окон, когда у главной всё работает: //дескриптор дочерней...

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru