Forum: Diğer Konular RSS
C++ dilinde referance mi pointer mı tercih edilmeli?
cos00kun #1
Üye Kas 2014 tarihinden beri · 70 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: C++ dilinde referance mi pointer mı tercih edilmeli?
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...
kerdemdemir #2
Üye Eyl 2013 tarihinden beri · 121 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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
cos00kun #3
Üye Kas 2014 tarihinden beri · 70 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
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 ?
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4508 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
kerdemdemir #5
Üye Eyl 2013 tarihinden beri · 121 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ç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
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: 2017-10-18, 07:59:42 (UTC -07:00)