December 16, 2017

Selamün Aleyküm;

QStack sınıfını inceliyordum ve orada da daha önceki zamanlarda incelediğim diğer kodlarda da şu şekilde dönüş türlerine sahip elemanlar var:

class QStack : public QVector<T>
{
public:
 ...
 T& top();
 const T& top() const;
};

Buradaki kodun ne olduğunu ve nasıl çalıştığını görebiliyoruz lakin "const T& top() const;" olan kısımda neden direk olarak T top() const; olarak tanımlamamışlar? Zaten iki türlü de değeri değiştirilemez. Neden const T& olarak kullanmışlar? Önemli bir sebebi mi var? Teşekkürler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

December 16, 2017

T olduğunda asıl elemanın kopyası döndürülür, T& olduğunda ise varolan elemana referans döndürülür. Bazen ikisi de işe yarar ama bazen birisini seçmek şarttır:

  • Üstteki eleman kavramı için gerçek eleman yoksa, referans döndürülemeyeceğinden T olması şarttır. (Bu, QStack için doğru değil çünkü tabii ki stack'i arka planda bir dizi olarak gerçekleştirmişlerdir ve dolayısıyla üstteki eleman gerçekten o dizide mevcuttur.)

  • Kopya çok masraflı bir işlemse referans döndürülür.

  • Döndürülen şeyin gerçekten referans olması istendiğinde referans döndürülür. Örneğin, çağıran &qs.top() diye adres alsa ve sonra elemana o adresten erişmek istese, bu işlemin geçerli olması için referans döndürmek şarttır. (Yoksa rvalue'nun adresini almaya yeltenmiş olur ve o adres sonra kullanılamaz, filan.)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]