Fonksiyon İşaretçilerini Tanımlama
Coddy'nin C Journey'sinin Object Oriented Programming bölümünün bir parçası — ders 33 / 61.
Şimdiye kadar struct gömme (embedding) kullanarak kalıtımı simüle etmeyi öğrendik. Ancak gerçek çok biçimlilik (polymorphism) — farklı nesnelerin aynı çağrıya farklı yanıtlar vermesi — daha fazlasını gerektirir: fonksiyon göstericileri (function pointers).
Bir `function` `pointer`'ı, bir `function`'ın adresini saklayan bir değişkendir. Tıpkı normal bir `pointer`'ın verinin adresini tutması gibi, bir `function` `pointer`'ı da çalıştırılabilir kodun adresini tutar.
Sözdizimi ilk bakışta korkutucu görünebilir. Bir function pointer'ı Declare etmek için, önce return türünü, ardından parantez içinde bir yıldız işareti ile pointer adını ve ardından parameters türlerini belirtirsiniz:
int (*operation)(int, int);Bu, iki int parametresi alan ve bir int döndüren herhangi bir fonksiyona işaret edebilen operation adında bir değişken bildirir. *operation etrafındaki parantezler çok önemlidir — onlar olmadan, bir işaretçi döndüren bir fonksiyon bildirmiş olursunuz.
Bu göstericiye bir işlev atamak için yalnızca işlevin adını (parantez olmadan) kullanmanız yeterlidir:
int add(int a, int b) {
return a + b;
}
int (*operation)(int, int);
operation = add; // Şimdi operation, add'e işaret ediyorFonksiyon adı, onun adresi olarak işlev görür. Ayrıca açıkça &add de kullanabilirsiniz, ancak bu isteğe bağlıdır — C'de her iki kullanım da eşdeğerdir.
Görev
KolayFonksiyon işaretçilerini (function pointers) bildirmeyi ve fonksiyonları bunlara atamayı pratik edelim. Bir fonksiyon işaretçisinin farklı aritmetik fonksiyonları tutabileceği basit bir matematiksel işlem sistemi oluşturacaksınız.
Şunları yapan bir program yazın:
- İki fonksiyon tanımlar:
multiply— ikiintparametresi alır ve bunların çarpımını döndürürsubtract— ikiintparametresi alır ve birinciden ikinciyi çıkararak sonucu döndürür
mainiçinde, ikiintparametresi alan ve birintdöndüren fonksiyonları gösterebilenoperationadında bir fonksiyon işaretçisi değişkeni bildirir- Üç girdi okur: iki tam sayı ve bir işlem kodu (multiply için 1, subtract için 2)
- İşlem koduna dayanarak,
operationişaretçinize uygun fonksiyonu atar - Atanan işlemin adını yazdırır, ardından işaretçi aracılığıyla fonksiyonu çağırmanın sonucunu yazdırır
Üç girdi alacaksınız: ilk sayı, ikinci sayı ve işlem kodu (1 veya 2).
Çıktınız şu şekilde görünmelidir:
Operation: multiply
Result: 35Burada multiply işlem adıdır (kod 2 ise subtract olur) ve 35, fonksiyonu işaretçiniz aracılığıyla çağırmanın sonucudur (bu durumda 5 × 7).
Unutmayın: fonksiyon işaretçisini bildirmek için dönüş türüne, parantez içinde yıldız işareti ile birlikte işaretçi adına ve parametre türlerine ihtiyacınız vardır. Bir fonksiyon atamak için parantez olmadan yalnızca fonksiyon adını kullanın.
Kendin dene
#include <stdio.h>
// TODO: multiply fonksiyonunu burada tanımla
// TODO: subtract fonksiyonunu burada tanımla
int main() {
int num1, num2, code;
// Girdiyi oku
scanf("%d", &num1);
scanf("%d", &num2);
scanf("%d", &code);
// TODO: 'operation' adında, şunlara işaret edebilecek bir fonksiyon işaretçisi bildir
// iki int parametre alan ve bir int döndüren fonksiyonlar
// TODO: İşlem koduna göre (1 multiply için, 2 subtract için),
// uygun fonksiyonu operation işaretçinize atayın
// TODO: İşlem adını ve sonucu yazdır
// Biçim:
// Operation: <name>
// Result: <result>
return 0;
}Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Object Oriented Programming bölümündeki tüm dersler
1Modüler Programlama Temelleri
Başlık DosyalarıInclude Guard'larKaynak DosyalarıStatik FonksiyonlarÖzet: Modüler Hesap Makinesi4Kapsülleme
Opaque Pointer KavramıOpaque Struct TanımlamaGetter ve Setter MetotlarıSetter Metotlarında DoğrulamaÖzet: Gizli Kutu7Fonksiyon İşaretçileri
Fonksiyon İşaretçilerini TanımlamaFonksiyon İşaretçilerini ÇağırmaFonksiyon İşaretçileri için TypedefFonksiyonları Argüman Olarak GeçirmeÖzet: Hesap Makinesi Yönlendirme2Nesneler ve Metotlar
Nesne Olarak Struct'lar'Self' İşaretçisiConst Doğruluğuİşaretçi vs DeğerYardımcı MetotlarÖzet: Point Manager5Proje: Basit Banka Hesabı
Proje KurulumuHesabın Oluşturulması3Nesne Yaşam Döngüsü
Constructor DeseniDestructor DeseniStack İlklendirmeDerin KopyalamaÖzet: String Wrapper6Kompozisyon Yoluyla Kalıtım
Struct Gömmeİlk Üye KuralıÜst Üyelere ErişimUpcastingÖzet: Şekil Hiyerarşisi