Örneklerin çoğu geri çağırmalara dönüşür : Başka bir işlevin f()
adresini ileten bir işlevi çağırırsınız g()
ve belirli bir görevi f()
çağırırsınız g()
. Eğer geçerseniz f()
adresini h()
yerine, daha sonra f()
yine arar h()
yerine.
Temel olarak, bu bir işlevi parametrize etmenin bir yoludur : Davranışının bir kısmı sabit kodlanmış f()
değil, geri arama işlevine kodlanmıştır . Arayanlar, f()
farklı geri arama işlevlerini ileterek farklı davranabilir. Bir klasik, qsort()
sıralama kriterini bir karşılaştırma işlevine işaretçi olarak alan C standart kitaplığındandır.
C ++ 'da, bu genellikle işlev nesneleri (aynı zamanda işlevler olarak da adlandırılır) kullanılarak yapılır . Bunlar, işlev çağrısı operatörünü aşırı yükleyen nesnelerdir, böylece onları bir işlevmiş gibi çağırabilirsiniz. Misal:
class functor {
public:
void operator()(int i) {std::cout << "the answer is: " << i << '\n';}
};
functor f;
f(42);
Bunun arkasındaki fikir, bir işlev işaretçisinin aksine, bir işlev nesnesinin yalnızca bir algoritma değil, aynı zamanda veri de taşıyabilmesidir:
class functor {
public:
functor(const std::string& prompt) : prompt_(prompt) {}
void operator()(int i) {std::cout << prompt_ << i << '\n';}
private:
std::string prompt_;
};
functor f("the answer is: ");
f(42);
Diğer bir avantaj, bazen işlev nesnelerine satır içi çağrıların işlev işaretçileri aracılığıyla yapılan çağrılardan daha kolay olmasıdır. Bu, C ++ 'da sıralamanın bazen C'de sıralamadan daha hızlı olmasının bir nedenidir.