Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Fatmarmelad
4 / 4 / 0
Регистрация: 20.02.2016
Сообщений: 855
1

Почему функция с объектами работает после того, как сработали деструкторы?

07.04.2017, 21:32. Просмотров 372. Ответов 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
#include<iostream>
using namespace std;
class first;
class second
{
private:
    int dt;
public:
    friend int addfunc(first, second);
    ~second(){ cout << "second finish!"; }
    second(){ dt = 8; }
};
class first
{
private:
    int dt;
public:
 
    friend int addfunc(first, second);
    ~first(){ cout << "first finish!"; }
    first() :dt(12){};
};
 
int addfunc(first f, second s)
{
    return f.dt + s.dt;
}
int main()
{
    
    second ss;
    first ff;
    cout << addfunc(ff, ss);
    system("pause");
    return 0;
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.04.2017, 21:32
Ответы с готовыми решениями:

Почему паскаль не работает, после того как пишу ничего не происходит? Может программа неправильная?
Program abc; Var a:Smallint; N:Integer; Begin N:=0; Read(a); While (a&lt;&gt;0) do Begin ...

Файл не удаляется после того, как отработала другая функция
Подскажите пожалуйста в чем проблема или как обойти это..... все нормально удаляет remove(...

Не работает SD карточка после того,как сделал её загрузочной
Всем привет! Недавно столкнулся с такой проблемой. В общем,на старом компьютере полетела винда,и...

Включаеться, но не работает компьютер после того, как я по нему стукнул.
В общем стукнул я ладошкой по системному корпусу (сверху) , компьютер начал перезагружаться и завис...

Не работает видеокарта после того,как вставил её в другой комп
Дело было так,я собирал компьютер,собрал и потом проверяю , изображение с видеокарты не было, я...

11
Photofenix
62 / 62 / 39
Регистрация: 18.11.2016
Сообщений: 556
Завершенные тесты: 1
07.04.2017, 21:37 2
Потому что деструкторы не сработали.
0
nd2
3099 / 2593 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
07.04.2017, 21:38 3
Деструкторы для ss и ff вызовутся при выходе из main(). Вот так попробуй:
C++
1
2
3
4
5
6
7
8
9
10
int main()
{
    {
         second ss;
         first ff;
         cout << addfunc(ff, ss);
    }
    system("pause");
    return 0;
}
0
Fatmarmelad
4 / 4 / 0
Регистрация: 20.02.2016
Сообщений: 855
07.04.2017, 21:45  [ТС] 4
То есть, если выводится текст first finish!
C++
1
~first(){ cout << "first finish!"; }
Это ещё не значит, что деструктор сработал?
0
07.04.2017, 21:45
nd2
3099 / 2593 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
07.04.2017, 21:52 5
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
как может срабатывать функция, если деструкторы уже , по идее, уничтожили данные объектов.
Деструкторы срабатывают для копий объектов (которые создаются при передаче объектов по значению), при выходе из функции, т.е., когда функция уже отработала.

Добавлено через 6 минут
Вот так измени функцию, чтобы было видно, что деструкторы срабатывают после вывода:
C++
1
2
3
4
void addfunc(first f, second s)
{
    cout << f.dt + s.dt;
}
1
Fatmarmelad
4 / 4 / 0
Регистрация: 20.02.2016
Сообщений: 855
07.04.2017, 21:57  [ТС] 6
nd2, действительно теперь результат появляется первым.
Но почему текст из деструктора выводился вообще, если деструктор не срабатывал?
0
nd2
3099 / 2593 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
07.04.2017, 21:59 7
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
Но почему текст из деструктора выводился вообще, если деструктор не срабатывал?
Я не говорил, что не срабатывал.
1
GbaLog-
Любитель чаепитий
3200 / 1501 / 472
Регистрация: 24.08.2014
Сообщений: 5,268
Записей в блоге: 1
Завершенные тесты: 2
07.04.2017, 22:01 8
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
если деструктор не срабатывал?
срабатывал.
по значению передаёшь, они копируются, деструкторы вызываются для объектов, которые были созданы на входе в функцию.
1
Fatmarmelad
4 / 4 / 0
Регистрация: 20.02.2016
Сообщений: 855
07.04.2017, 23:04  [ТС] 9
nd2, значит если вводить
C++
1
 cout << f.dt + s.dt;
, то складываются не копии, да?
0
nd2
3099 / 2593 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
07.04.2017, 23:33 10
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
то складываются не копии, да?
Откуда такой вывод? Если передал объекты в функцию по значению, то в функции действия производятся с копиями.
Для проверки:
C++
1
2
3
4
void addfunc(first f, second s)
{
    cout << ++f.dt << ' ' << ++s.dt;
}
После вызова функции в main(), значения полей в объектах останутся те же, что и были до вызова.
0
Fatmarmelad
4 / 4 / 0
Регистрация: 20.02.2016
Сообщений: 855
07.04.2017, 23:48  [ТС] 11
nd2, почему тогда если в функции писать
C++
1
cout << f.dt + s.dt;
, то первым выводится результат функции, а потом уже деструктор срабатывает?
0
nd2
3099 / 2593 / 1134
Регистрация: 29.01.2016
Сообщений: 8,690
08.04.2017, 00:02 12
Цитата Сообщение от Fatmarmelad Посмотреть сообщение
почему
...
Цитата Сообщение от nd2 Посмотреть сообщение
Деструкторы срабатывают для копий объектов (которые создаются при передаче объектов по значению), при выходе из функции, т.е., когда функция уже отработала.
1
08.04.2017, 00:02
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.04.2017, 00:02

хард не работает после того, как я выдернул не тот провод
случилось вот что я выдернул не тот провод и он оказался от переносного харда теперь в &quot;моем...

Не работает мышка и клавиатура после того,как вернул компьютер в исходное состояние
Здравствуйте.Сегодня после того,как попробовал вернуть компьютер в исходное состояние,у меня...

Теория. Почему в данном случае copy() не работает после reserve(), но работает после resize()?
Есть такая функция: void Array::SetStartIndexes(sz3_Arr_t *array) { ...


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

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

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