Forum: Diğer Konular RSS
C++'da Dönüş Türü: const T& ve T Farkı
İbrahim #1
Üye Eki 2015 tarihinden beri · 167 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C++'da Dönüş Türü: const T& ve T Farkı
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.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4592 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2018-01-21, 18:25:06 (UTC -08:00)