İşlev İşaretçileri
İşlevleri bağımsız değişken olarak aktarın
İşlev İşaretçileri, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 1. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
İşlev İşaretçisi Nedir?
İşlev işaretçisi, bir işlevin adresini saklar; böylece işlevi dolaylı olarak çağırabilir veya veriler gibi aktarabilirsiniz.
- Türü, imzayı belirtir.
- İşlevlerin davranışı parametre olarak almasını sağlar.
#include <iostream>
int add(int a, int b) { return a + b; }
int main() {
int (*op)(int, int) = add;
std::cout << op(3, 4) << '\n';
return 0;
}Türü Bildirme
int (*op)(int, int) bildirimi şu şekilde okunur: op, iki int alan ve bir int döndüren bir işlev işaretçisidir. *op çevresindeki parantezler gereklidir.
#include <iostream>
int square(int x) { return x * x; }
int main() {
int (*fn)(int) = square;
std::cout << fn(5) << '\n';
return 0;
}İşaretçi Üzerinden Çağırma
Bir işlev işaretçisini, işlevin kendisini çağırdığınız gibi çağırırsınız. İşaretçinin başvurusunu açıkça kaldırmanız da mümkündür, ancak buna nadiren ihtiyaç duyulur.
#include <iostream>
void greet() { std::cout << "Hello\n"; }
int main() {
void (*g)() = greet;
g();
(*g)();
return 0;
}İşlevleri Bağımsız Değişken Olarak Aktarma
Bir işlev, işlev işaretçisi parametresi kabul edebilir; bu da çağıranın özel davranış eklemesini sağlar.
#include <iostream>
int apply(int x, int (*fn)(int)) { return fn(x); }
int doubler(int n) { return n * 2; }
int main() {
std::cout << apply(10, doubler) << '\n';
return 0;
}Çalışma Zamanında Seçim Yapma
İşlev işaretçisi bir değişken olduğundan, program çalışırken hangi işlevin çağrılacağına karar verebilirsiniz.
#include <iostream>
int add(int a, int b) { return a + b; }
int sub(int a, int b) { return a - b; }
int main() {
bool wantAdd = true;
int (*op)(int, int) = wantAdd ? add : sub;
std::cout << op(8, 3) << '\n';
return 0;
}İşlev İşaretçisi Dizileri
Bir değerle dizinlenen basit bir dağıtım tablosu oluşturmak için birkaç işlev işaretçisini bir dizide saklayın.
#include <iostream>
int add(int a, int b) { return a + b; }
int mul(int a, int b) { return a * b; }
int main() {
int (*ops[2])(int, int) = {add, mul};
std::cout << ops[0](2, 3) << ' ' << ops[1](2, 3) << '\n';
return 0;
}Tür Tanımlaması Kullanmak
İşaretçi söz dizimi gürültülüdür. Bir tür tanımlaması veya using takma adı, türe okunabilir bir ad verir.
#include <iostream>
using BinOp = int(*)(int, int);
int add(int a, int b) { return a + b; }
int main() {
BinOp op = add;
std::cout << op(6, 7) << '\n';
return 0;
}Algoritmalarla İşlev İşaretçileri
Standart algoritmalar çağrılabilir nesneleri kabul eder ve sıradan bir işlev de bunlardan biri olarak çalışır. Burada bir koşul, çift sayıları sayar.
#include <iostream>
#include <vector>
#include <algorithm>
bool isEven(int n) { return n % 2 == 0; }
int main() {
std::vector<int> v = {1, 2, 3, 4, 5, 6};
int c = std::count_if(v.begin(), v.end(), isEven);
std::cout << "Evens: " << c << '\n';
return 0;
}Sınırlama: Durum Yok
Sıradan bir işlev işaretçisi, yakalanan hiçbir veriyi taşıyamaz. Çağrılar arasında bağlamı hatırlamanız gerekiyorsa, genel değişkenleri kullanmanız veya daha gelişmiş çağrılabilir nesnelere geçmeniz gerekir.
#include <iostream>
int counter = 0;
int next() { return ++counter; }
int main() {
int (*fn)() = next;
std::cout << fn() << ' ' << fn() << ' ' << fn() << '\n';
return 0;
}Yakalama Yapmayan Lambda İfadeleri Dönüşür
Hiçbir şeyi yakalamayan bir lambda ifadesi, eşleşen bir işlev işaretçisine örtük olarak dönüşebilir; bu, küçük satır içi işlevler için kullanışlıdır.
#include <iostream>
int main() {
int (*fn)(int) = [](int x) { return x + 100; };
std::cout << fn(1) << '\n';
return 0;
}Boş İşlev İşaretçileri
Bir işlev işaretçisi nullptr olabilir; bu, hiçbir şeyi göstermediği anlamına gelir. Tanımsız davranışı önlemek için çağırmadan önce her zaman kontrol edin.
#include <iostream>
int main() {
int (*fn)(int) = nullptr;
if (fn) {
std::cout << fn(5) << '\n';
} else {
std::cout << "No function set\n";
}
return 0;
}Kısa Kontrol
İşlev işaretçilerinin sınırlamaları hakkındaki anlayışınızı sınayın.
Özet
İşlev işaretçileri hakkında şunları öğrendiniz:
- Bir işlevin adresini tutarlar ve işlev gibi çağrılırlar
- Davranışı parametre olarak aktarmanızı ve dağıtım tabloları oluşturmanızı sağlarlar
- Takma adlar türlerini okunabilir hâle getirir
- Durum taşıyamazlar, ancak yakalama yapmayan lambda ifadeleri onlara dönüşebilir
Sırada, durum taşıyanlar da dâhil olmak üzere her çağrılabilir nesneyi saklayabilen std::function ile tanışacaksınız.
Sıkça Sorulan Sorular
“İşlev İşaretçileri” dersi ücretsiz mi?
Evet — “İşlev İşaretçileri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“İşlev İşaretçileri” dersinde ne öğreneceğim?
İşlevleri bağımsız değişken olarak aktarın C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 1. dersidir.
“İşlev İşaretçileri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- İşlev İşaretçileri
- std::function
- std::bind
- Çağrılabilir Ögeleri Seçme