Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Наткнулся на причуду языка

48K
25 февраля 2010 года
ratava
21 / / 20.10.2009
Вот простенький тестовый пример:

Код:
#include <iostream>
using namespace std;

class A
{
public:
    A(int input):i(input)
    {
        cout<<"constructor"<<endl;
    }

    void ShowData()
    {
        cout<<"ShowData "<<i<<endl;
    }

    virtual void VShowData()
    {
        cout<<"VShowData "<<i<<endl;
    }

    ~A()
    {
        cout<<"destructor"<<endl;
    }
private:
    int i;
};

void main()
{
    A* a;
    {
       a = &A(5); //2
       a->ShowData();
    }
}


Странность в том, что сразу после выполнения шага 2 в output появятся:
"constructor
destructor"

Кто-нибудь может найти этому разумное объяснение?:)
11
25 февраля 2010 года
oxotnik333
2.9K / / 03.08.2007
http://www.rsdn.ru/article/cpp/lvalue.xml
87
25 февраля 2010 года
Kogrom
2.7K / / 02.02.2008
Это не причуда, а так называемый Temporary object. Для чего нужны? Поясню на примере. Если бы в классе был определён оператор +, то можно было бы сделать что-то типа:

A a = A(1) + A(2) + A(3);

после выполнения операции все такие временные объекты удаляются.

Указывать на такие объекты вредно по понятным причинам. Потому нормальный компилятор должен выдать предупреждение.
394
25 февраля 2010 года
MegaMozg
317 / / 18.03.2006
Правильнее будет:

 
Код:
void main()
{
    A* a;
    {
       a = new A(5); //2
       a->ShowData();
    }

    delete a;
}


А в вашем случае, по-моему, это не причуда языка, а счастливая случайность:


 
Код:
a = &A(5);
// создается временный объект, его адрес присваевается a, объект тут-же удаляется

 
Код:
a->ShowData()
; // правильная работа ShowData() - счастливая случайность (блок памяти, который занимал временный объект не успел заполниться другими данными)
48K
25 февраля 2010 года
ratava
21 / / 20.10.2009
Спасибо за ссылку!
Как говорится век живи, век учись:)
16K
25 февраля 2010 года
asmforce
186 / / 05.01.2010
Так некорректно: a = &A(5), согласен. Но с тем, что...

Цитата: MegaMozg
Правильнее будет:
// правильная работа ShowData() - счастливая случайность (блок памяти, который занимал временный объект не успел заполниться другими данными)



...не согласен. Насколько я знаю, временный объект существует, пока не произойдет выход из области видимости (scope).
Ибо на уровне реализации, в конце области видимости компилятор добавляет вызов деструктора, чем подтверждается вывод.

87
25 февраля 2010 года
Kogrom
2.7K / / 02.02.2008
Цитата: asmforce
...не согласен.



http://msdn.microsoft.com/en-us/library/a8kfxa78(VS.80).aspx
или, если с английским плохо:
http://ru.wikipedia.org/wiki/Временный_объект

24K
25 февраля 2010 года
engel65536
50 / / 17.10.2007
Цитата: asmforce
...не согласен. Насколько я знаю, временный объект существует, пока не произойдет выход из области видимости (scope).


Область видимости здесь - не тело функции, а само RValue, из которой выход происходит после выполнения оператора присваивания.

16K
26 февраля 2010 года
asmforce
186 / / 05.01.2010



Сорри.
Теперь все. Раньше пробовал разные фичи искать. Но, видимо, до такого извратства, чтобы сохранять адрес временного объекта, не доходил.
Я почему то решил, что тут как и при статическом выделении...

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог