0

関数が値渡しによってオブジェクトを返す方法を研究していました。そこで、理論をテストするために、カスタムメイドのクラスである 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 回出力しなかった理由を教えてください。

ありがとう。

4

1 に答える 1

4

これは、関数の戻り値を保持するために作成された一時オブジェクトを排除する戻り値の最適化の効果です。これにより、冗長なコピー コンストラクタとデストラクタの呼び出しが最適化されます。

于 2012-09-06T11:41:05.960 に答える