Kullanıcı Aletleri

Site Aletleri


tr:cs:cpp:common:reference

Referanslar

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.

L-Value Referansları

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ı

L-Value Referans Değişkeni

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.

  • Referanslar, bağlı oldukları nesneden önce silinebilirler.
  • Refere edilen nesneler, referanslarından önce silinebilirler.

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.

Const L-Value Referansları

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

1)
Buradaki değişken tabiri uygun bir kullanım değildir. Yazının devamında sebebini anlayabilirsiniz.
2)
Derleyici açısından herhangi bir fark yoktur. ancak okunurluk açısından daha iyi olur.
tr/cs/cpp/common/reference.txt · Son değiştirilme: 2025/05/02 21:49 Değiştiren: ulascemh