Функция может возвращать объект в точку вызова. В качестве примера рассмотрим программу:
#include <iostream.h>
class myclass {
int i;
public:
void set_i(int n) {i=n;}
int get_i() {return i;}
};
myclass f(); // возвращение объекта типа myclass
int main()
{
myclass o;
о = f ();
cout << о.get_i() << "\n";
return 0;
}
myclass f()
{
myclass x;
x.set_i(1);
return x;
}
Когда функция возвращает объект, автоматически создается временный объект, содержащий возвращаемое значение. Именно этот объект фактически возвращается функцией. После того, как значение возвращено, этот объект уничтожается. Уничтожение временного объекта может вызывать неожиданные побочные эффекты в некоторых ситуациях. Например, если возвращаемый функцией объект имеет деструктор, освобождающий динамически зарезервированную память, то эта память будет освобождена даже в том случае, когда объект, получающий возвращаемое значение, будет продолжать использовать ее. Как будет продемонстрировано дальше в этой книге, имеются способы преодолеть эту проблему, для чего используется перегрузка оператора присваивания и определение конструктора копирования.