Capture modes
- C++ kursu
- Orta seviye
- Ders 78/116
- 5 dk
[=], [&], [this] ile capture modlarını öğrenirsin.
Capture modes
Capture clause, lambda'nın dışındaki değişkenleri nasıl yakalayacağını belirler. Üç temel mod vardır: [=] tüm değişkenleri değer ile yakalar (kopya), [&] tüm değişkenleri referans ile yakalar, [this] sınıfın this işaretçisini yakalar.
Değer ile yakalamada lambda bir kopya alır; dış değişkeni değiştirmez. Referans ile yakalamada lambda doğrudan dış değişkene erişir; değişiklik dışarıya yansır. Tek bir değişkeni de yakalayabilirsin: [&count] yalnızca count'u referans ile yakalar. Karışık mod da mümkün: [=, &count] tümünü değer ile, count'u referans ile yakalar.
Değer ve referans farkı
Değer ile yakalama [=] bir kopya oluşturur. Lambda içinde değişiklik yapsan bile dış değişken değişmez. Referans ile yakalama [&] doğrudan erişim sağlar; lambda içindeki değişiklik dış değişkeni etkiler.
Örnek: int n = 0; auto f = [&n]() { n++; }; f(); f(); çağrısından sonra n değeri 2 olur. Çünkü lambda n'yi referans ile yakaladı ve her çağrıda artırdı. Eğer [=] ile yakalasaydık n değişmezdi; lambda içindeki kopya artar ama dışarıya yansımazdı. Referans ile yakalamada dikkatli ol: lambda, referansın geçerli olduğu sürede kullanılmalıdır.
Uygulama Referans ile sayacı artır
int count = 0; tanımla. [&count]() { count++; } lambda'sını increment değişkenine ata. Lambda'yı iki kez çağır ve count değerini std::cout ile yazdır.
Başlangıç kodu
#include <iostream>
int main() {
int count = 0;
// referans capture ile count'u artıran lambda yaz ve iki kez çağır
return 0;
}Örnek çözüm
#include <iostream>
int main() {
int count = 0;
auto increment = [&count]() { count++; };
increment();
increment();
std::cout << count;
return 0;
}Beklenen çıktı
2
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Capture modunu anlamıyla eşle
| Kavram | Anlamı |
|---|---|
[=] |
Değer ile yakala |
[&] |
Referans ile yakala |
[this] |
Sınıf işaretçisi |
[&count] |
Tek değişken referans |
2 Referans capture'ı tamamla
int count = 0;
auto f = [____]() { count++; };
int count = 0;
auto f = [&count]() { count++; };
Açıklama: [&count] ile count referans olarak yakalanır.
3 Hangi capture modu dış değişkeni değiştirebilir?
int n = 0;
auto f = ???() { n++; };- [=] (değer ile)
- [] (yakalama yok)
- [this]
- [&] (referans ile) Doğru cevap
Açıklama: [&] referans ile yakalar, dış değişkeni değiştirebilir.