#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"
Кто-нибудь может найти этому разумное объяснение?:)
A a = A(1) + A(2) + A(3);
после выполнения операции все такие временные объекты удаляются.
Указывать на такие объекты вредно по понятным причинам. Потому нормальный компилятор должен выдать предупреждение.
Код:
void main()
{
A* a;
{
a = new A(5); //2
a->ShowData();
}
delete a;
}
{
A* a;
{
a = new A(5); //2
a->ShowData();
}
delete a;
}
А в вашем случае, по-моему, это не причуда языка, а счастливая случайность:
Код:
a = &A(5);
Код:
a->ShowData()
Как говорится век живи, век учись:)
Цитата: MegaMozg
Правильнее будет:
// правильная работа ShowData() - счастливая случайность (блок памяти, который занимал временный объект не успел заполниться другими данными)
// правильная работа ShowData() - счастливая случайность (блок памяти, который занимал временный объект не успел заполниться другими данными)
...не согласен. Насколько я знаю, временный объект существует, пока не произойдет выход из области видимости (scope).
Ибо на уровне реализации, в конце области видимости компилятор добавляет вызов деструктора, чем подтверждается вывод.
Цитата: asmforce
...не согласен.
http://msdn.microsoft.com/en-us/library/a8kfxa78(VS.80).aspx
или, если с английским плохо:
http://ru.wikipedia.org/wiki/Временный_объект
Цитата: asmforce
...не согласен. Насколько я знаю, временный объект существует, пока не произойдет выход из области видимости (scope).
Область видимости здесь - не тело функции, а само RValue, из которой выход происходит после выполнения оператора присваивания.
Цитата: Kogrom
http://msdn.microsoft.com/en-us/library/a8kfxa78(VS.80).aspx
или, если с английским плохо:
http://ru.wikipedia.org/wiki/Временный_объект
или, если с английским плохо:
http://ru.wikipedia.org/wiki/Временный_объект
Сорри.
Теперь все. Раньше пробовал разные фичи искать. Но, видимо, до такого извратства, чтобы сохранять адрес временного объекта, не доходил.
Я почему то решил, что тут как и при статическом выделении...