関数が値渡しによってオブジェクトを返す方法を研究していました。そこで、理論をテストするために、カスタムメイドのクラスである 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";
}
関数内のオブジェクトのローカル コピーと、return ステートメントの実行中に作成された一時オブジェクトがいつ破棄されたかを追跡できるように、cout "hello" ステートメントを配置してデストラクタをオーバーロードしました。
したがって、デストラクタへの 2 回の呼び出しが期待されていました。1 つはオブジェクトの関数のローカル コピー用で、もう 1 つは一時オブジェクト用です。しかし、代わりに、私は1つしか受け取りませんでした!
私のプログラムが「hello」を 2 回出力しなかった理由を教えてください。
ありがとう。