Деструктор объекта - параметра функции
От: SergioNM  
Дата: 19.01.11 13:55
Оценка:
Вот такой простенький пример взят из книги Г.Шилдта "Самоучитель C++"

#include <iostream>
using namespace std;

class samp
{
    int i;
public:
    samp(int n)
    {
        i = n;
        cout << "Constructor" << endl;
    }
    ~samp()
    {
        cout << "Destructor" << endl;
    }
    int get_i() { return i;}
};

int sqr_it(samp ob)
{
    return ob.get_i()*ob.get_i();
}

int main()
{
    samp a(10);

    cout << sqr_it(a) << endl;

    return 0;
}


Результат работы согласно книге:
Constructor
100
Destructor
Destructor


Что меня смущает: получается, что main() сначала вывела результат работы функции, а потом только вызвался деструктор объекта, использовавшегося внутри функции. По-моему должно быть наоборот.
У меня на машине так и есть:
Constructor
Destructor
100
Destructor


Может ли этот порядок выполнения зависеть от платформы, от компилятора? Может ли какой-нибудь хитрый компилятор в целях хитрой оптимизации вызывать всё именно в таком порядке, как в книге? Ведь естественный порядок — сначала вызвать деструктор, потом вывести "100".

Или же просто неточность в книге? Я не супер-пупер специалист по C++, чтобы утверждать это наверняка.
Re: Деструктор объекта - параметра функции
От: XJess  
Дата: 19.01.11 14:40
Оценка:
SNM>Или же просто неточность в книге? Я не супер-пупер специалист по C++, чтобы утверждать это наверняка.

Я тоже не супер-пупер спец, но в Шилдовских книгах опечаток и ошибок обычно немерено, так что не удивлюсь, если просто неточность.
Re: Деструктор объекта - параметра функции
От: blackhearted Украина  
Дата: 19.01.11 14:53
Оценка: 8 (2)
Здравствуйте, SergioNM, Вы писали:

codepad
Re: Деструктор объекта - параметра функции
От: savitar  
Дата: 19.01.11 14:57
Оценка:
Здравствуйте, SergioNM, Вы писали:

SNM>У меня на машине так и есть:

SNM>
SNM>Constructor
SNM>Destructor
SNM>100
SNM>Destructor
SNM>


все правильно, так как в sqr_it() создается копия samp и при выходе из функции она разрушается.
Re[2]: Деструктор объекта - параметра функции
От: blackhearted Украина  
Дата: 19.01.11 15:10
Оценка:
Здравствуйте, savitar, Вы писали:

S>Здравствуйте, SergioNM, Вы писали:


SNM>>У меня на машине так и есть:

SNM>>
SNM>>Constructor
SNM>>Destructor
SNM>>100
SNM>>Destructor
SNM>>


S>все правильно, так как в sqr_it() создается копия samp и при выходе из функции она разрушается.


MSVS 2005 тоже выдаёт

Constructor
Destructor
100
Destructor


может другие компиляторы как-то оптимизируют этот момент...
Re[3]: Деструктор объекта - параметра функции
От: SergioNM  
Дата: 20.01.11 15:21
Оценка:
B>может другие компиляторы как-то оптимизируют этот момент...

Так всё-таки? Возможна ли такая оптимизация?
По мне так сначала точно должен быть вызван деструктор, а уж потом вывод в cout в main'e.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.