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

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

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

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

03.05.2010, 20:41. Просмотров 1282. Ответов 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();
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
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 при выходе
Genius Ignat
1235 / 773 / 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.
Больше ни чего особенного нет.
Я даже не понимаю как ваш пример запустился без определения операции +
][акер
#define книжный_червь Я
182 / 93 / 6
Регистрация: 30.01.2010
Сообщений: 780
03.05.2010, 21:11  [ТС]     Вызывается деструктор когда обьект не уничтожен! #4
А я чё то не понял! При передаче нового значения обьекту вызывается деструктор?
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:31     Вызывается деструктор когда обьект не уничтожен! #5
операции присваивания вызывается деструктор,
Не то ляпнул, не из-за операции присваивания, только из-за +

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

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

Добавлено через 2 минуты
Я даже не понимаю как ваш пример запустился без определения операции +
Это я понимаю, но зачем было затевать оболочку int когда работаешь не так как этого требует
смысл оболочки.
Iworb
анимешник++
93 / 60 / 2
Регистрация: 03.11.2009
Сообщений: 413
03.05.2010, 21:48     Вызывается деструктор когда обьект не уничтожен! #8
не переопределена операция сложения двух объектов.
operator + переопредели и все должно сработать
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
03.05.2010, 21:48     Вызывается деструктор когда обьект не уничтожен! #9
Genius Ignat, ааа, не обратил внимание что у тебя свой код
думал ты процитировал верхний
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:51     Вызывается деструктор когда обьект не уничтожен! #10
Iworb:
Дело даже не в этом, ты посмотри что возвращают операции ++ и -- они возвращают int
а для int + определен автоматически.
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 минуту
ах да, они еще должны принимать объект класса..... Для инкриментных - один, для декриментых - два...
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 21:57     Вызывается деструктор когда обьект не уничтожен! #12
Iworb:
Махинации с возвратом объектов операциями ++ -- типа не класс,
допустимы, и почему стандарт над этим не поработает, просто это бессмысленно, прокачивать
int когда твоя оболочка и так int.
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;}
мне кажется так будет правильно. Или я ошибаюсь?
Genius Ignat
1235 / 773 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
03.05.2010, 22:01     Вызывается деструктор когда обьект не уничтожен! #14
принимать объект класса..... Для инкриментных - один, для декриментых - два...
Принимать объект не надо, потому как объект сам вызывает операцию ++ или -- .

Добавлено через 1 минуту
Объект сам работает со своими данными, и поэтому ни каких посредников для операции не надо.
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, поэтому я и говорю, что возвращать нужно объект. Я понимаю, что объект состоит только из одного целочисленного значения, но все-равно чувствую тут подвох =/
][акер
#define книжный_червь Я
182 / 93 / 6
Регистрация: 30.01.2010
Сообщений: 780
03.05.2010, 22:09  [ТС]     Вызывается деструктор когда обьект не уничтожен! #16
Я кажется понял! При операции присваивания вызывается в начале деструктор, а потом и конструктор?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.05.2010, 22:27     Вызывается деструктор когда обьект не уничтожен!
Еще ссылки по теме:
C++ Почему вызывается деструктор?
Два раза вызывается деструктор C++
C++ Вызывается ли деструктор в данной программе?
Почему деструктор вызывается два раза C++
Почему виртуальный деструктор вызывается дважды? C++

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

Или воспользуйтесь поиском по форуму:
Roma_F
331 / 246 / 5
Регистрация: 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;
Yandex
Объявления
03.05.2010, 22:27     Вызывается деструктор когда обьект не уничтожен!
Ответ Создать тему
Опции темы

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