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

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

Войти
Регистрация
Восстановить пароль
 
TanaTiX
Модератор
2746 / 1592 / 146
Регистрация: 19.02.2011
Сообщений: 5,736
#1

Особенности работы деструктора - C++

09.05.2014, 11:38. Просмотров 198. Ответов 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
#include <iostream>
#include <iomanip>
using namespace std;
 
class complex{
    private:
    double re,im;
    friend complex operator+(complex a, complex b){
        return complex(a.re+b.re,a.im+b.im);
    }
    public:
    complex(double r, double i){
        re=r;
        im=i;
    }
    complex(double r){
        re=r;
        im=0;
    }
    complex(){
        re=0;
        im=0;
    }
    ~complex(){
        cout<<"complex removed "<<re<<" "<<im<<endl;
    }
    void show(){
    cout<<re<<" "<<im<<endl;
}
};
 
 
int main(){
    double a,b,c,d;
    
    cin>>a;
    cin>>b;
    cin>>c;
    cin>>d;
    complex aa=complex(a,b);
    complex bb=complex(c,d);
    aa.show();
    bb.show();
    complex cc=aa+bb;
    cc.show();
    
    return 0;
}
Но я не могу понять одну вещь: к моменту окончания работы программы десьркктор вызываеься 5 раз (2 раза для введенных пар значений и 1 раз для суммы). Почему 5 раз, а не 3?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.05.2014, 11:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Особенности работы деструктора (C++):

Ошибка работы деструктора - C++
Здравствуйте. Недавно начала программировать на C++, поэтому возможно жителям данного форума мой вопрос покажется сильно нубским. Тем не...

Особенности работы fread - C++
Решаю типовую задачу: считывание заголовка bmp-файла (точечного рисунка). Однако у меня ничего не получалось. В ходе расследования...

Особенности и порядок работы с указателями, обмен данными между динамическими массивами - C++
Написать программу обмена данными между двумя динамическими массивами,как можно проще. Заранее большое спасибо)

Вызов деструктора - C++
Доброго вам времени суток. Проблема в том, что деструктор не выводит сообщение без этой строки. s1.~Shave(); И я не уверен, что так...

Работа деструктора - C++
Доброго дня, уважаемые программисты! Лаба. Есть класс Дата_и_Время, в классе часть полей должна быть динамическими. class...

Ошибка деструктора - C++
Имеется шаблон класса- динамического массива. После создания функции push_back начал ругаться конструктор. Объясните пожалуйста в чем дело?...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
09.05.2014, 12:01 #2
Цитата Сообщение от TanaTiX Посмотреть сообщение
complex aa=complex(a,b);
Тут два объекта, один из которых временный. Строчкой ниже - аналогично.
0
TanaTiX
Модератор
2746 / 1592 / 146
Регистрация: 19.02.2011
Сообщений: 5,736
09.05.2014, 12:06  [ТС] #3
Т.е. когда я передаю объект в качестве аргумента, то создается их копия, а не передается ссылка на них? Реально ведь создается только 3 объекта.
0
0x10
2464 / 1636 / 238
Регистрация: 24.11.2012
Сообщений: 4,031
09.05.2014, 12:11 #4
delete
Добавлено через 2 минуты
Все, вру я. RVO никто не отменял.
Просто смотрю не туда.
Цитата Сообщение от TanaTiX Посмотреть сообщение
operator+(complex a, complex b)
Тут-то по значению аргументы принимаются.
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2014, 12:11
Привет! Вот еще темы с ответами:

Описание деструктора - C++
Пример: #include&lt;iostream&gt; using namespace std; class A { int A; };

Вызов деструктора - C++
Вызывается ли деструктор объекта при завершении программы? а при аварийном завершении? А если снять процесс приложения диспетчером?

Использование деструктора - C++
Я не очень понимаю в каких случаях в классе или шаблоне надо реализовавывать дестрактор а в каких не не надо ??? вот например код : ...

Вызов деструктора - C++
Есть написанный мною код: #include &lt;iostream&gt; class Foo { private: int *key; public: Foo (const int a=0) { key = new int...


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

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

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