函数对象 (Funktionsobjekte) / 仿函数 (Funktoren)
功能上等同于函数,但具有对象的所有特性。 是重载了 () 运算符的类。 比普通函数更灵活:可以拥有属性(成员变量)、支持继承、支持虚函数。 在许多 STL 算法中被广泛使用。 示例:
class PlusFunktor{
int p; // 成员变量
public:
PlusFunktor(int x): p(x) {}; // 构造函数,初始化 p
int operator() (int x) { // 重载 () 运算符
return x + p; // 将成员变量 p 加到参数 x 上
}
};
重载了 () 运算符:将属性 p 加到参数 x 上。
PlusFunktor plus2(2); // 创建一个对象,p = 2
int i = 10;
i = plus2(i); // 调用对象的 operator(),相当于 i = plus2.operator()(i); 结果 i = 12
示例
class PlusFunktor{
int p;
public:
PlusFunktor(int x): p(x) {};
int operator() (int x) {return x + p;}
};
int main() {
PlusFunktor plus2(2); // 创建一个函数对象,p = 2
int constexpr n = 6;
int feld[] = {1, 2, 3, 4, 5, 6}; // 数组初始化为 {1,2,3,4,5,6}
for (int i: feld) cout << i << " ";
cout << endl; // 输出: 1 2 3 4 5 6
transform(feld, feld+n, feld, plus2);
// 使用 plus2 对象对数组每个元素进行变换
// 结果: feld = {3, 4, 5, 6, 7, 8}
transform(feld, feld+n, feld, PlusFunktor(3));
// 创建一个新的临时函数对象 PlusFunktor(3) (p=3),并对数组每个元素进行变换
// 结果: feld = {6, 7, 8, 9, 10, 11}
}
说明: transform 函数将一元操作(unary operation)应用于数组的每个元素。
第一次 transform: 使用已创建的函数对象 plus2(其 p=2),将数组每个元素加2。 第二次 transform: 直接传入一个临时的函数对象 PlusFunktor(3),它会立即被构造(p=3),并将数组每个元素加3。
—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com