Я изучал, как функция возвращает объект посредством возврата по значению. Итак, чтобы проверить теорию, я запустил простую программу, в которой была функция, возвращающая экземпляр myclass — пользовательский класс.
#include <iostream>
#include <cstdio>
using namespace std;
class myclass {
int i;
public:
void set_i(int n) { i=n; }
~myclass();
};
myclass f(int k); // return object of type myclass
int main()
{
f(20);
return 0;
}
myclass f(int k)
{
myclass x;
x.set_i(k);
return x;
}
myclass::~myclass() {
cout << "hello\n";
}
Я перегрузил деструктор, поместив в него оператор «привет» cout, чтобы я мог отслеживать, когда локальная копия объекта внутри функции, а также временный объект, созданный во время выполнения оператора возврата, были уничтожены.
Итак, меня ожидали 2 звонка деструктору; один для локальной копии функции объекта и один для временного объекта. Но вместо этого я получил только один!
Пожалуйста, поделитесь, почему моя программа не выдавала «привет» дважды.
Благодарю.
Это эффект оптимизация возвращаемого значения который исключает временный объект, созданный для хранения возвращаемого значения функции. Это оптимизирует вызовы конструктора избыточных копий и вызовов деструкторов.
Других решений пока нет …