惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Vercel News
Vercel News
博客园 - 【当耐特】
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
小众软件
小众软件
Hugging Face - Blog
Hugging Face - Blog
aimingoo的专栏
aimingoo的专栏
WordPress大学
WordPress大学
G
Google Developers Blog
博客园 - 叶小钗
大猫的无限游戏
大猫的无限游戏
P
Proofpoint News Feed
J
Java Code Geeks
U
Unit 42
云风的 BLOG
云风的 BLOG
阮一峰的网络日志
阮一峰的网络日志
N
Netflix TechBlog - Medium
宝玉的分享
宝玉的分享
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
D
Docker
V
Visual Studio Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
H
Help Net Security
V
V2EX
T
Tailwind CSS Blog

Yusuf Aytas

When Code Is Cheap, Does Quality Still Matter? Why Crouching Tiger, Hidden Dragon Is a Masterpiece Why We Ignore Advice The Mirror Is Part of the Machine When Too Many Maps Overlap on One Person The Work Runs on Different Maps Your Work Introduces You Trial By Fire The Dude Why Headcount Math Lies Capacity Is the Roadmap The Roadmap Is Not the System Torres del Paine W Trek Escaping Status Theater Incentives Drive Everything Scaling Culture Without Dilution What Good Looks Like Why Airport Security Feels Random Why Politics Appear How to Work with Me The Janus Protocol Multi-Horizon Delivery Framework What Good Execution Looks Like Managing Your Manager Why Kingdom of Heaven’s Director’s Cut Is Better AI Broke Interviews Most of What We Call Progress Managers Have Been Vibe Coding All Along Stop Wasting Brainpower Why Over-Engineering Happens
Pass By Reference
Yusuf Aytas · 2008-10-13 · via Yusuf Aytas

Published · 2 min read

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.