跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ operator() 运算符重载详解

C++ 中 operator() 重载机制,即函数对象(Functor)的使用。内容包括基础语法、状态保持实现(如计数器、累加器)、比较器编写、STL 算法库集成应用(sort、transform 等)以及高级场景(闭包模拟、函数组合)。同时探讨了性能优化实践,如 const 修饰符和引用传递,强调其相比函数指针在类型安全和编译期优化上的优势。

不知所云发布于 2026/3/29更新于 2026/10/26108 浏览

C++ 中 operator() 重载详解

1. operator() 重载基础概念

1.1 函数对象定义
  • 函数对象(Functor):重载了 operator() 的类实例,可以像函数一样被调用
  • 语法格式:ReturnType operator()(ParameterList) const
  • 灵活性:支持多种参数列表的重载版本
1.2 基础示例
class Adder {
public:
    int operator()(int a, int b) const {
        return a + b;
    }
};
// 调用示例
Adder adder;
int result = adder(5, 3); // 等价于 adder.operator()(5, 3)

2. 状态保持的函数对象

2.1 计数器实现
class Counter {
private:
    int count;
    int step;
public:
    Counter(int initial = 0, int increment = 1) : count(initial), step(increment) {}
    
    // 无参数调用,返回当前值并递增
    int operator()() {
        int current = count;
        count += step;
        return current;
    }
    
    
    {
        count = value;
    }
    
    
    {
        count = start;
        step = increment;
         (); 
    }
};

;
 val1 = (); 
 val2 = (); 
(); 
 val3 = (, ); 
// 重置计数器
void operator()(int value)
// 重载带步长的调用
int operator()(int start, int increment)
return
operator
// 调用无参版本
// 调用示例
Counter counter(0, 1)
int
counter
// 返回 0,count 变为 1
int
counter
// 返回 1,count 变为 2
counter
10
// 重置为 10
int
counter
100
5
// 重置为 100,步长为 5,返回 100
2.2 累加器实现
class Accumulator {
private:
    int sum;
public:
    Accumulator(int initial = 0) : sum(initial) {}
    
    int operator()(int value) {
        sum += value;
        return sum;
    }
    
    void operator()(int value, bool reset) {
        if (reset) sum = 0;
        sum += value;
    }
};
// 调用示例
Accumulator acc(0);
int result1 = acc(5); // sum = 5
int result2 = acc(3); // sum = 8
acc(10, true); // 重置后累加,sum = 10

3. 比较器函数对象

3.1 字符串长度比较器
class StringLengthComparator {
public:
    bool operator()(const std::string& a, const std::string& b) const {
        return a.length() < b.length();
    }
};
// 调用示例
std::vector<std::string> strings = {"apple", "banana", "cherry", "date"};
std::sort(strings.begin(), strings.end(), StringLengthComparator());
3.2 数值比较器
class NumberComparator {
private:
    bool ascending;
public:
    NumberComparator(bool asc = true) : ascending(asc) {}
    
    bool operator()(int a, int b) const {
        return ascending ? a < b : a > b;
    }
};
// 调用示例
std::vector<int> numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end(), NumberComparator(true));   // 升序
std::sort(numbers.begin(), numbers.end(), NumberComparator(false));  // 降序

4. 算法库中的应用

4.1 自定义谓词函数对象
class GreaterThan {
private:
    int threshold;
public:
    GreaterThan(int t) : threshold(t) {}
    
    bool operator()(int value) const {
        return value > threshold;
    }
};
// 调用示例
std::vector<int> numbers = {1, 5, 3, 8, 2, 9};
int count = std::count_if(numbers.begin(), numbers.end(), GreaterThan(5)); // count = 2 (8, 9)
4.2 变换函数对象
class Square {
public:
    int operator()(int x) const {
        return x * x;
    }
};

class AddConstant {
private:
    int constant;
public:
    AddConstant(int c) : constant(c) {}
    
    int operator()(int x) const {
        return x + constant;
    }
};
// 调用示例
std::vector<int> input = {1, 2, 3, 4, 5};
std::vector<int> output(input.size());

// 使用 Square
std::transform(input.begin(), input.end(), output.begin(), Square()); // output = {1, 4, 9, 16, 25}

// 使用 AddConstant
std::transform(input.begin(), input.end(), output.begin(), AddConstant(10)); // output = {11, 12, 13, 14, 15}

5. 函数对象容器

5.1 操作器容器
class OperationContainer {
private:
    std::string operation;
public:
    OperationContainer(const std::string& op) : operation(op) {}
    
    int operator()(int a, int b) const {
        if (operation == "add") return a + b;
        if (operation == "sub") return a - b;
        if (operation == "mul") return a * b;
        if (operation == "div") return b != 0 ? a / b : 0;
        return 0;
    }
};
// 调用示例
OperationContainer addOp("add");
OperationContainer mulOp("mul");
int result1 = addOp(5, 3); // 返回 8
int result2 = mulOp(5, 3); // 返回 15
5.2 条件过滤器
class Filter {
private:
    std::function<bool(int)> condition;
public:
    Filter(std::function<bool(int)> cond) : condition(cond) {}
    
    std::vector<int> operator()(const std::vector<int>& input) const {
        std::vector<int> result;
        for (int value : input) {
            if (condition(value)) {
                result.push_back(value);
            }
        }
        return result;
    }
};
// 调用示例
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

// 过滤偶数
Filter evenFilter([](int x){ return x % 2 == 0; });
auto evenNumbers = evenFilter(numbers); // {2, 4, 6, 8, 10}

// 过滤大于 5 的数
Filter greaterFilter([](int x){ return x > 5; });
auto greaterNumbers = greaterFilter(numbers); // {6, 7, 8, 9, 10}

6. 高级应用场景

6.1 闭包模拟
class Closure {
private:
    int capture_value;
public:
    Closure(int val) : capture_value(val) {}
    
    int operator()(int x) const {
        return x + capture_value;
    }
    
    int operator()(int x, int y) const {
        return x * y + capture_value;
    }
};
// 调用示例
Closure closure(10);
int result1 = closure(5); // 返回 15 (5 + 10)
int result2 = closure(3, 4); // 返回 22 (3 * 4 + 10)
6.2 函数组合器
template<typename F, typename G>
class Compose {
private:
    F f;
    G g;
public:
    Compose(F f_func, G g_func) : f(f_func), g(g_func) {}
    
    template<typename T>
    auto operator()(T x) const -> decltype(f(g(x))) {
        return f(g(x));
    }
};
// 调用示例
auto square = [](int x){ return x * x; };
auto increment = [](int x){ return x + 1; };
Compose<decltype(square), decltype(increment)> compose(square, increment);
int result = compose(5); // 先执行 increment(5) = 6, 再执行 square(6) = 36

7. 性能考虑与最佳实践

7.1 const 修饰符使用
class StatelessFunction {
public:
    // 无状态函数对象应使用 const 修饰
    int operator()(int x) const {
        return x * 2;
    }
};
7.2 引用参数传递
class StringProcessor {
public:
    std::string operator()(const std::string& input) const {
        // 使用 const 引用避免拷贝
        return input + "_processed";
    }
};

8. 总结

  • 灵活性:operator() 重载提供了函数对象的灵活性
  • 状态保持:函数对象可以维护内部状态
  • 算法兼容:与 STL 算法完美配合
  • 性能优势:编译时优化,避免函数指针调用开销
  • 类型安全:编译时类型检查,避免运行时错误

目录

  1. C++ 中 operator() 重载详解
  2. 1. operator() 重载基础概念
  3. 1.1 函数对象定义
  4. 1.2 基础示例
  5. 2. 状态保持的函数对象
  6. 2.1 计数器实现
  7. 2.2 累加器实现
  8. 3. 比较器函数对象
  9. 3.1 字符串长度比较器
  10. 3.2 数值比较器
  11. 4. 算法库中的应用
  12. 4.1 自定义谓词函数对象
  13. 4.2 变换函数对象
  14. 5. 函数对象容器
  15. 5.1 操作器容器
  16. 5.2 条件过滤器
  17. 6. 高级应用场景
  18. 6.1 闭包模拟
  19. 6.2 函数组合器
  20. 7. 性能考虑与最佳实践
  21. 7.1 const 修饰符使用
  22. 7.2 引用参数传递
  23. 8. 总结

更多推荐文章

查看全部
  • 基于 WebGIS 与百度天气接口的复古天气预报系统构建
  • AI 核心概念速通教程
  • Sharpa Robotics 量产视觉基触觉手 SharpaWave,0.005N 超敏感知 + 模块化设计
  • AI 产品经理学习路线:从零基础到大模型应用实战指南
  • Java 高德地图面检索中 WGS84 坐标转换与 POI 查询实战
  • Java 编译报错:无效的目标发行版 17 与源发行版配置冲突
  • Qclaw 使用指南:基于微信的本地 AI 智能体工具入门
  • RunningHub:AIGC 创作平台深度解析
  • Spatial Joy 2025 全球 AR&AI 开发大赛参赛指南与赛道解析
  • 二叉排序树与堆的区别
  • 从前端到 DevOps:各类开发者 AI 工作流工具
  • Open-Lovable 网页克隆工具本地部署与远程访问方案
  • Spatial Joy 2025 全球 AR&AI 赛事:开发者资源与参赛指南
  • C/C++ 错误处理机制与常用函数
  • Vivado 入门实战:D 触发器设计与烧录流程
  • Kimi-VL-A3B-Thinking 部署与 vLLM 性能调优实战
  • 鸿蒙生态共建:智慧医疗领域的分布式革新与实践
  • 二分查找实战:旋转数组最小值与缺失数字
  • VS Code 远程连接时 Copilot Chat 图标不显示的解决方法
  • OpenMV 人脸追踪算法工作原理揭秘

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online