0

私は参照リターンを行っていて、一時オブジェクトに出くわしました。それらを識別する方法がわかりません。この例を使用して説明してください:

aとが同じクラスのオブジェクトである場合bは、 binary を検討してoperator+ください。などの式で使用すると、f(a+b)a+b一時オブジェクトになり、またはfの形式にする必要があります。の形式にすることはできませんが、によって返されるオブジェクトの内容を変更することもできます。f(const <class name>&)f(<class name>)f(<class name>&)(a+b).g()g()a+b

4

3 に答える 3

1

単純なケースとして、次のコードを考えてみてください。

int func(int lhs, int rhs)
{
    return lhs + rhs;
}

int main() {
    int a = 1, b = 2, c = 3;
    return func(a * c, b * c);
}

func は 2 つの整数を取るため、プログラムはa * candの値を計算し、b * cそれらをどこかに保存する必要があります。aまたはbまたはに保存することはできませんc。したがって、結果のコードは次と同等です。

int lhsParam = a * c;
int rhsParam = b * c;
return func(lhsParam, rhsParam);

繰り返しますが、最後にfunc()計算値 を返しますlhs + rhs。コンパイラはそれを新しい場所に保存する必要があります。

整数などの場合、これは非常に単純に思えますが、代わりに考えてみてください

int function(std::string filename);
function("hello");

filenameであるstd::string必要がありますが、合格しましたconst char*。したがって、コンパイラが行うことは次のとおりです。

std::string filenameParam = "hello"; // construct a new object
function(filenameParam);

前の例と同じですが、今回は一時オブジェクトを構築していることがより明確になることを願っています。

注:それらを「somethingParam」と呼ぶ規則は、この回答を明確にするためのものです。

于 2013-10-18T18:49:04.780 に答える