Thread overview
C++ dilinde referance mi pointer mı tercih edilmeli?
Oct 05, 2017
cos00kun
Oct 06, 2017
kerdemdemir
Oct 06, 2017
cos00kun
Oct 06, 2017
kerdemdemir
October 06, 2017

Aslında konu başlığı sorunun ta kendisi :)
C++ dilinde ihtiyacımızı her ikisi de gördüğü taktirde referance mi yoksa pointer mı kullanmalıyız ?

Bu konuyla ilgili birçok yerde eğer her ikisi de yapacağınız işi görüyorsa pointer yada referance arasında referance kullanmamızı tavsiye ediyor.. Bunun doğruluğundan ve nedenliğinden emin olmak istedim..

Teşekkürler...

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

October 06, 2017

Ben referans tutmanizi tavsiye ederim. Isaretciler ve isaretci aritmetigi biraz tehlikeli seyler bence boyle hafizanin olmadik yerlerinde bulabiliyor insan kendini. Veya hayata geitrme islemi filan unutulabiliyor.

Referanslara null atanamiyor. Bu nedenle referanslari kontrol edemiyoruz pointerlar gibi. Eger boyle bir ihtiyaciniz varsa da C++14 'de dile eklenen std::optional"i tavsiye ederim.

Erdemdem

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

October 06, 2017

Bazan bu C++ dilini öğrenmenin sonunun olmadığını düşünüyorum... Ne zaman C++ yi rayına sokup D ye başlayacağımı ben bile kestiremiyorum :)

Cevap için teşekkürler.. Anladığım kadarıyla Referance daha çok tavsiye ediliyor ve eğer pointer kullanımından daha ucuzsa (hız, bellek kullanımı v.s.) tercih edilebilir bir seçenek gibi duruyor..
Referancelere neden Null atanamadığını tam olarak anlayamadım ? bir mantığı varmı söyleyebilirmisiniz ?

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

October 06, 2017

Çok dar bir çercevede fonksiyon dönüş değerleri üzerinden bir kaç örnek vereyim dedim umarım faydalı olur.


struct D
{
   int m_val  = 5 ; //C++14 lazım değer atıyabilimek için
   bool m_hata = true;

   int& RefDon()
   {
       if ( m_hata )
			return -1; // Ya -1 kullanılıyorsa referans ile burda hata durumlarını belirtemiyorum.
	    return m_val;
   }

	int* PointerDon()
	{
       if ( m_hata )
			return nullptr; // İşaretçilerin null olma durumunu böyle durumlarda kullanabiliyorum.
	    return &m_val;
	}

	std::optional<int> opsiyonelDon( )  // C++17 lazım
	{
		if (m_hata)
			return {};
		return m_val;
	}
}

Şimdi bunları çok az kullanalım.

   D d;
	//Ornek1
	auto refVal = d.RefDon();
	std::cout << refVal; ,

	//Ornek2
   auto pointerVal = d.PointerDon();
	std::cout << *pointerVal; // İşte bahsettiğim durumlardan biri hata durumunda nullptr'nin değerini almaya çalışıyoruz ve güm!!

	//Ornek3
	auto pointerVal2 = d.PointerDon();
	if ( pointerVal2 ) // null durumunu kontrol ediyoruz
		std::cout << *(pointerVal2 + 1) ; //Yine gümledik bize verilen işaretçiyi işaret ettiği yeri değiştirebiliyoruz
		                                 // Tabi bu çok basit gözükse ve yapmıyacağımız birşey olsa bile daha karmaşık senaryolarda karşımıza sık sık çıkıyor

	//Ornek4
	auto optVal = d.opsiyonelDon(); // Ek bir katman ile(std::optional) daha az tehlikeli bir değer dönebiliyoruz.
	if ( optVal ) {
       std::cout << optVal .value();
   }



Erdemdem

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

October 06, 2017

Referanslar da perde arkasında zaten gösterge. O yüzden hız farkı yok.

İşleve referans göndermek aslında bir kolaylık: gönderen adres almak zorunda değil, kullanan -> işlecini kullanmak zorunda değil. Bir referans örneğin 'ref.üye' diye kullanıldığında aslında perde arkasında otomatik olarak şuna dönüştürülüyor gibi düşünülebilir 'perde_arkasındaki_gösterge->üye'

Referans, var olan nesnenin takma adı anlamına geldiğinden null atamak söz konusu değil.

Referans yeğlemek doğru bir kural. Olabildiğince referans olsun; uygun olmadığında gösterge olsun:

  • Eğer işlevin sonucu "bulamadım" kavramını da içerekse gösterge döndürülebilir çüknü gösterge null olabilir.

  • Aynı nedenden, eğer işleve "bu parametre değeri geçersiz" denmesi gerekiyorsa işlev gösterge alabilir.

  • Bağlı listede olduğu gibi, bir veri yapısında "henüz bağlı değil" gibi bir kavram null ile gösterilebilir; o zaman yine gösterge...

Ali

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