Bu kod pasajı:
int& func1()
{
int i;
i = 1;
return i;
}
işlev çağrısının kapsamıyla sınırlı bir ömre sahip bir nesneye bir takma ad (başvuru) döndürdüğünüz için çalışmaz. Bu, bir kez func1()döndüğünde, int iölür, işlevden dönen referansı değersiz hale getirir, çünkü artık var olmayan bir nesneye atıfta bulunur.
int main()
{
int& p = func1();
/* p is garbage */
}
İkinci sürüm çalışır çünkü değişken, işlev çağrısının yaşam süresine bağlı olmayan ücretsiz depoda tahsis edilir. Ancak, deletetahsisi sizin sorumluluğunuzdadır int.
int* func2()
{
int* p;
p = new int;
*p = 1;
return p;
}
int main()
{
int* p = func2();
/* pointee still exists */
delete p; // get rid of it
}
Tipik olarak, işaretçiyi bir RAII sınıfına ve / veya bir fabrika işlevine kaydırırsınız, böylece kendinize gerek kalmaz delete.
Her iki durumda da, değeri kendisi döndürebilirsiniz (sağladığınız örneğin muhtemelen uydurulmuş olduğunu fark etsem de):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
Büyük nesneleri aynı şekilde func3()döndürmenin tamamen iyi olduğunu unutmayın, çünkü günümüzde hemen hemen her derleyici bir tür dönüş değeri optimizasyonu uygulamaktadır :
class big_object
{
public:
big_object(/* constructor arguments */);
~big_object();
big_object(const big_object& rhs);
big_object& operator=(const big_object& rhs);
/* public methods */
private:
/* data members */
};
big_object func4()
{
return big_object(/* constructor arguments */);
}
int main()
{
// no copy is actually made, if your compiler supports RVO
big_object o = func4();
}
İlginç bir şekilde, geçici bir sabit referansına bağlamak tamamen yasal C ++ ' dır .
int main()
{
// This works! The returned temporary will last as long as the reference exists
const big_object& o = func4();
// This does *not* work! It's not legal C++ because reference is not const.
// big_object& o = func4();
}
int& i = * new int;