Pass By Reference

C++’ta fonksiyon çağrılarında en temel ayrımlardan biri şudur: Fonksiyona bir değerin kendisini mi gönderiyorsun, yoksa o değerin kendisine erişimi mi veriyorsun. Bu ayrım küçük görünür ama yan etki, performans, API tasarımı ve hata ayıklama gibi konularda belirleyicidir.

Pass by value, adından da anlaşılacağı gibi, değişkenin değerini kopyalayıp fonksiyona taşır. Fonksiyon kendi kopyası üzerinde çalışır. Bu yüzden fonksiyon içinde ne yapılırsa yapılsın çağıran taraftaki değişken etkilenmez. Bu yaklaşımın net bir avantajı vardır: Sınırlar keskindir, yan etki yoktur. Dezavantajı ise kopyalama maliyetidir. Basit tiplerde önemsizdir ama büyük objelerde ciddi olabilir.

Pass by reference ise değişkenin kendisini göndermez. Değişkenin kendisine erişimi gönderir. Yani fonksiyon aynı değişken üzerinde işlem yapar. Bu yüzden fonksiyon içinde yapılan değişiklik, çağıran tarafta da görülür. Bu yaklaşım güçlüdür ama sorumluluk ister. Çünkü erişim verdiğin anda kontrol de paylaşılır. Hata olursa kopya bozulmaz, orijinal bozulur.

Bu örnekte iki fonksiyon arasındaki fark tam olarak bu noktada ortaya çıkıyor:

Birinci fonksiyon, sayının karesini hesaplar ve sadece sonuç döndürür. Orijinal değişkene dokunmaz.
İkinci fonksiyon ise sayının karesini hesaplamakla kalmaz, aynı zamanda orijinal değişkenin değerini de yerinde değiştirir.

Kısacası burada mesele “kare almak” değil. Mesele şudur: Fonksiyon çağıranın verisine dokunabiliyor mu, dokunamıyor mu.

Aşağıdaki kod bu farkı sade şekilde gösterir.

#include <iostream>
using namespace std;

// Pass by Value: num1 is copied
int getSquare1(int num1) {
    return num1 * num1;
}

// Pass by Reference: num2 is passed by reference and can be modified
int getSquare2(int& num2) {
    num2 = num2 * num2;
    return num2;
}

int main() {
    int num1 = 2, num2 = 2;

    cout << "Square of num1 (by value): " << getSquare1(num1) << endl;
    cout << "Value of num1 after getSquare1: " << num1 << endl;

    cout << "Square of num2 (by reference): " << getSquare2(num2) << endl;
    cout << "Value of num2 after getSquare2: " << num2 << endl;

    return 0;
}

Bu kod çalıştığında num1 aynı kalır. Çünkü fonksiyon yalnızca kopya üzerinde çalışmıştır. num2 ise değişir. Çünkü fonksiyon num2’nin kendisine erişmiştir ve yerinde güncellemiştir.

C++’ta bu ayrımı net tutmak önemlidir. Değer ile geçmek daha güvenlidir çünkü yan etki üretmez. Referans ile geçmek daha güçlüdür çünkü kopya üretmez ve değişiklik yapmana izin verir. Ama referans verdiğin an, fonksiyon artık sadece hesap yapan bir yer değil, çağıranın state’ine dokunan bir yer haline gelir. Bu yüzden referans kullanımı tasarım kararıdır, sadece “daha kolay” olduğu için yapılmamalıdır.

Stay updated

Receive insights on tech, leadership, and growth.

Subscribe if you want to read posts like this

No spam. One email a month.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.