
class MyAdd { public: int operator()(int a, int b) // 重载 () 运算符 { return a b; } };MyAdd add;cout add(3, 5) add(3, 5) endl;add(3, 5)这种写法在形式上很像构造函数MyAdd(3,5)或静态函数调用所以产生了困惑。先给结论它既不是构造函数也不是静态函数而是 C 的operator()函数调用运算符重载。关键认知()是一个运算符很多人没意识到()括号在 C 里是一个运算符和、[]、一样可以被重载运算符重载写法使用形式operatora b[]下标operator[]a[b]vector 的v[i]就靠它()函数调用operator()a(b)← 仿函数就靠它所以当您在类里写了int operator()(int a, int b)就赋予了它的对象一种能力可以用对象(参数)的形式调用。add(3, 5)的真身struct MyAdd { int operator()(int a, int b) { return a b; } }; MyAdd add; // add 是一个对象 add(3, 5); // 这一句编译器其实翻译成 ↓ add.operator()(3, 5); // ← 调用 add 这个对象的 operator() 成员也就是说add(3, 5)本质上就是调用 add 对象的一个成员函数只不过这个成员函数有个特殊的名字operator()C 允许你省略函数名、直接写对象(参数)来触发它。这就是仿函数的魔法所在。 四种像函数的调用一次分清我用一个类把您疑惑的几种情况全列出来对比struct MyAdd { MyAdd() {} // ① 构造函数无参 MyAdd(int a, int b) {} // ① 构造函数有参 int operator()(int a, int b) { // ② 函数调用运算符重载 return a b; } void hi() {} // ③ 普通成员函数 static void hello() {} // ④ 静态函数 }; MyAdd add; // ① 创建对象调用构造函数 MyAdd() add(3, 5); // ② 调用 operator()返回 8 ← 这才是仿函数 add.hi(); // ③ 调用普通成员函数要写函数名 点号 Add::hello(); // ④ 调用静态函数类名::函数名 MyAdd(3, 5); // ① 调用构造函数 MyAdd(int,int)创建临时对象不是加法