Potongan kode ini:
int& func1()
{
int i;
i = 1;
return i;
}
tidak akan berfungsi karena Anda mengembalikan alias (referensi) ke objek dengan masa pakai terbatas pada cakupan pemanggilan fungsi. Itu berarti sekali func1()kembali, int imati, membuat referensi yang dikembalikan dari fungsi tidak berharga karena sekarang merujuk ke objek yang tidak ada.
int main()
{
int& p = func1();
/* p is garbage */
}
Versi kedua berfungsi karena variabel dialokasikan di penyimpanan gratis, yang tidak terikat pada masa panggilan fungsi. Namun, Anda bertanggung jawab untuk deletemengalokasikan 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
}
Biasanya Anda akan membungkus pointer dalam beberapa kelas RAII dan / atau fungsi pabrik sehingga Anda tidak perlu melakukannya deletesendiri.
Dalam kedua kasus tersebut, Anda dapat mengembalikan nilainya sendiri (meskipun saya menyadari contoh yang Anda berikan mungkin dibuat-buat):
int func3()
{
return 1;
}
int main()
{
int v = func3();
// do whatever you want with the returned value
}
Perhatikan bahwa mengembalikan objek besar dengan cara yang sama func3()mengembalikan nilai primitif karena hampir setiap compiler saat ini menerapkan beberapa bentuk pengoptimalan nilai pengembalian :
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();
}
Menariknya, mengikat sementara ke referensi const sangat legal C ++ .
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;