Ö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.