大多數示例歸結為回調:您調用一個函數f()
傳遞另一個函數的地址g()
,并f()
調用g()
某些特定任務。如果您傳遞f()
了h()
相反的地址,f()
則會回撥h()
。
基本上,這是一種參數化函數的方法:其行為的某些部分不是硬編碼的f()
,而是進入回調函數。f()
調用者可以通過傳遞不同的回調函數來使行為不同。經典qsort()
來自C標準庫,它將其排序標準作為指向比較函數的指針。
在C ++中,這通常使用函數對象(也稱為仿函數)來完成。這些是重載函數調用操作符的對象,因此您可以像調用函數一樣調用它們。例:
class functor {
public:
void operator()(int i) {std::cout << "the answer is: " << i << '\n';}};functor f;f(42);
這背后的想法是,與函數指針不同,函數對象不僅可以攜帶算法,還可以攜帶數據:
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);
另一個優點是,與通過函數指針調用相比,有時更容易內聯調用函數對象。這就是為什么在C ++中排序有時比在C中排序更快的原因。