Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
][акер
#define книжный_червь Я
182 / 93 / 6
Регистрация: 30.01.2010
Сообщений: 780
#1

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

03.05.2010, 20:41. Просмотров 1334. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.05.2010, 20:41
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вызывается деструктор когда обьект не уничтожен! (C++):

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

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

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

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

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

Почему вызывается деструктор? - C++
Доброго времени суток. Написал такой код: struct O { virtual ~O() { cout &lt;&lt; &quot;hey&quot;; } }; struct...

16
Roma_F
331 / 246 / 5
Регистрация: 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
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
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 книжный_червь Я
182 / 93 / 6
Регистрация: 30.01.2010
Сообщений: 780
03.05.2010, 21:11  [ТС] #4
А я чё то не понял! При передаче нового значения обьекту вызывается деструктор?
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:31 #5
операции присваивания вызывается деструктор,
Не то ляпнул, не из-за операции присваивания, только из-за +

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

Добавлено через 5 минут
И вообще a = ++a + --b; составное выражение.
Второй деструктор будет вызван после того как операция присваивания поработает с объектом
который вернулся из +
0
Roma_F
331 / 246 / 5
Регистрация: 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
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:47 #7
Roma_F:
Я работаю со свои примером и анализирую его, и мой пример верен, и анализ правильный.
В Философию программы: которую написал ][акер, вникать не хочется,
просто не понял, что этим он хотел сказать.

Добавлено через 2 минуты
Я даже не понимаю как ваш пример запустился без определения операции +
Это я понимаю, но зачем было затевать оболочку int когда работаешь не так как этого требует
смысл оболочки.
0
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
03.05.2010, 21:48 #8
не переопределена операция сложения двух объектов.
operator + переопредели и все должно сработать
0
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:48 #9
Genius Ignat, ааа, не обратил внимание что у тебя свой код
думал ты процитировал верхний
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:51 #10
Iworb:
Дело даже не в этом, ты посмотри что возвращают операции ++ и -- они возвращают int
а для int + определен автоматически.
0
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
03.05.2010, 21:55 #11
[акер;702689]int operator--()
{
a++;
return a;
}
затем вы вызываете --b
по схеме переопределенный оператор возвращает тип int, следовательно он откуда-то его получает и куда-то отдает. --b - получает из b, а возвращает куда? насколько я помню оператор должен быть того же класса, что и объект и возвращать также объект.

Добавлено через 1 минуту
ах да, они еще должны принимать объект класса..... Для инкриментных - один, для декриментых - два...
0
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:57 #12
Iworb:
Махинации с возвратом объектов операциями ++ -- типа не класс,
допустимы, и почему стандарт над этим не поработает, просто это бессмысленно, прокачивать
int когда твоя оболочка и так int.
0
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
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
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 22:01 #14
принимать объект класса..... Для инкриментных - один, для декриментых - два...
Принимать объект не надо, потому как объект сам вызывает операцию ++ или -- .

Добавлено через 1 минуту
Объект сам работает со своими данными, и поэтому ни каких посредников для операции не надо.
0
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
03.05.2010, 22:08 #15
C++
1
2
3
4
5
nt operator--()
{
a++;
return a;
}
Раз так, то смысл в этой функции? Раз она работает с элементами класса, то ей ненужно ничего возвращать, если же там должен быть тип int, то при вызове ++b возвращается тип int и записывается в переменную b, которая является переменной типа inkr, поэтому я и говорю, что возвращать нужно объект. Я понимаю, что объект состоит только из одного целочисленного значения, но все-равно чувствую тут подвох =/
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 22:08
Привет! Вот еще темы с ответами:

Почему не вызывается деструктор? - C++
Всем доброго времени суток! Подскажите пожалуйста - почему не вызывается деструктор при выполнении строки 48? #include&lt;iostream&gt;...

Не вызывается деструктор структуры - C++
Создал класс. Членом класса является указатели на структуру, которая определена в классе. Поля структуры указатели, т.к. работа будет с...

Вызывается ли деструктор в данной программе? - C++
вызывается ли деструктор в данной программе и почему он не выводит на экран,что он выведен...?#include &quot;stdafx.h&quot; #include &lt;iostream&gt; ...

Два раза вызывается деструктор - C++
Создал класс, в процессе выполнения программы вызвал деструктор, но когда программа завершается, деструктор вызывается повторно и вылетает...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
03.05.2010, 22:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru