C++'da referans, mevcut bir nesne için bir takma addır. Bir referans tanımlandıktan sonra, referans üzerindeki gerçekleştirilen herhangi bir işlem refere edilen nesneye uygulanır.
Başlangıçta çok saçma gelsede. Aslında referanslar C++'ın en önemli özelliklerinden biridir.
C++'da fonksiyonlarada referanslar oluşturulabilir. Ancak bu kullanım pek yaygın değildir.
C++'da iki çeşit referans vardır. Bunlar r-value ve l-value referanslarıdır.
Bir lvalue referansı, mevcut bir lvalue için takma ad görevi görür.
Bir lvalue referansını bildirmek için; referansın tipine & işareti eklenir.
int // normal bir int tipi int& // int tipi nesneye bir lvalue referansı double& // double tipi nesneye bir lvalue referansı
Bir lvalue referans tipiyle yapılabilecek şeylerden biri de bir lvalue referans değişkeni oluşturmaktır. Bir lvalue referans değişkeni, bir lvalue'ye referans olarak davranan bir değişkendir.1)
int x { 5 }; // x normal bir int değişkenidir int& ref { x }; // ref artık x değişkeni için takma ad olarak kullanılabilen bir lvalue referans değişkenidir std::cout << x << '\n'; // x değerini yani 5 yazdırır std::cout << ref << '\n'; // ref aracılığıyla x değerini yani 5 yazdırır
Bir referans tanımlarken, & işaretini tipin yanına yerleştirin.2)
Referanslar C++'da birer nesne değillerdir. Bir referansın var olması veya bellek alanı işgal etmesi gerekmez. Derleyici eğer mümkünse, bir referansın kullanıldığı yerlerde refere edilen nesne ile değiştirerek referansları optimize edecektir. Ancak, bu her zaman mümkün değildir ve bu gibi durumlarda referanslar bellek alanı gerektirebilir.
Bu sebepten ötürü referans değişleni isimlendirmesi biraz yanıltıcı olmaktadır. Çünkü referanslar birer nesne değillerdir.
Referanslar nesne olmadıkları için, bir nesnenin gerekli olduğu her yerde kullanılamazlar. Nesne olan bir referansa veya yeniden atanabilen bir referansa ihtiyaç duyduğunuz durumlarda, std::reference_wrapper
kullanabilirsiniz.
Sabitler gibi referanslarda bildirilirken başlatılmak zorundadır.
int& invalidRef; // HATA: referanslar başlatılmalıdır int x { 5 }; int& ref { x }; // int referansı int değişkenine bağlanır. }
Referanslar başlatıldıklarında refere ettikleri nesneye bağlanırlar. Buna referans bağlaması denir. Bir kere bağlandıktan sonra başka bir nesneyi refere edemezler. Yani bağlanmış bir referans başka bir nesneyi refere etmesi için yeniden atanamaz.
Lvalue referansları sadece değiştirilebilir lvalue nesnelere bağlanabilir. const
nesnelere bağlanamaz. Çünkü o zaman referans üzerinden o nesnelere müdahale edilebilir.
Referanslar ve refere ettikleri nesnelerin ömürleri birbirlerinden bağımsızdır.
Bu ikinci durum. sızıntıya neden olabilir. Bir referansın refere ettiği nesne silinirse, referans üzerinden o nesneye erişilmeye çalışılırsa, tanımsız davranış oluşur.
Lvalue referansları tanımlanırken const
anahtar kelimesi kullanılırsa bu referanslar, bağlı oldukları nesne sabitmiş gibi davranırlar.
Referansın bağlanacağı nesnenin sabit olması zorunlu değildir. Arka plandaki nesne değiştirilebilir olsa dahi const lvalue referansı üzerinden değiştirilemez.
const int x { 5 }; // x değiştirilemeyen bir lvalue'dir. const int& ref_x { x }; // ref_x bir const değere yapılan bir lvalue referansıdır int y { 5 }; // x değiştirilebilir bir lvalue'dir. const int& ref_y { x }; // bir const referansı değiştirilebilir bir lvalue'ye bağlayabiliriz ref_y = 7; // HATA: const referans aracılığıyla bir nesneyi değiştiremeyiz
Refere edilen nesneyi değiştirmeniz gerekmediği durumlarda, const
lvalue referansları kullanmak daha iyidir.
Const lvalue referansları, rvalue'yede bağlanabilir.
const int& ref { 5 }; // 5 bir rvalue'dir. std::cout << ref << '\n'; // 5 yazdırır.
Böyle bir durumda geçici bir nesne oluşturulur ve rvalue ile başlatılır. Referansımız bu geçici nesneye bağlanır.
Normalde bildiğimiz gibi geçici nesneler bulundukları ifadenin sonunda silinirler. Ancak bu durumda referansımız sızıntıya sebep olması gerekir. C++ bunun önüne geçmek için bu duruma özel geçici nesnenin ömrünü uzatır.
Bir const lvalue referansı geçici bir nesneye bağlandığında, geçici nesnenin ömrü referansın ömrüne uyacak şekilde uzatılır.
UCH Viki'den alınmıştır. https://wiki.ulascemh.com/doku.php?id=tr:cs:cpp:common:reference