三小隻 發表於 2026-1-7 10:10:52

C++ 中 operator() 重载与最佳实践

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>C++ 中 operator() 重载详解</li><ul class="second_class_ul"><li>1. operator() 重载基础概念</li><ul class="third_class_ul"><li>1.1 函数对象定义</li><li>1.2 基础示例</li></ul><li>2. 状态保持的函数对象</li><ul class="third_class_ul"><li>2.1 计数器实现</li><li>2.2 累加器实现</li></ul><li>3. 比较器函数对象</li><ul class="third_class_ul"><li>3.1 字符串长度比较器</li><li>3.2 数值比较器</li></ul><li>4. 算法库中的应用</li><ul class="third_class_ul"><li>4.1 自定义谓词函数对象</li><li>4.2 变换函数对象</li></ul><li>5. 函数对象容器</li><ul class="third_class_ul"><li>5.1 操作器容器</li><li>5.2 条件过滤器</li></ul><li>6. 高级应用场景</li><ul class="third_class_ul"><li>6.1 闭包模拟</li><li>6.2 函数组合器</li></ul><li>7. 性能考虑与最佳实践</li><ul class="third_class_ul"><li>7.1 const 修饰符使用</li><li>7.2 引用参数传递</li></ul><li>8. 总结</li><ul class="third_class_ul"></ul></ul></ul></div><p class="maodian"></p><h2>C++ 中 operator() 重载详解</h2>
<p class="maodian"></p><h3>1. operator() 重载基础概念</h3>
<p class="maodian"></p><h4>1.1 函数对象定义</h4>
<ul><li><strong>函数对象(Functor)</strong>:重载了 operator()的类实例,可以像函数一样被调用</li><li><strong>语法格式</strong>:<code>ReturnType operator()(ParameterList) const</code></li><li><strong>灵活性</strong>:支持多种参数列表的重载版本</li></ul>
<p class="maodian"></p><h4>1.2 基础示例</h4>
<div class="jb51code"><pre class="brush:cpp;">class Adder {
public:
    int operator()(int a, int b) const {
      return a + b;
    }
};
// 调用示例
Adder adder;
int result = adder(5, 3);// 等价于 adder.operator()(5, 3)</pre></div>
<p class="maodian"></p><h3>2. 状态保持的函数对象</h3>
<p class="maodian"></p><h4>2.1 计数器实现</h4>
<div class="jb51code"><pre class="brush:cpp;">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;
    }
    // 重置计数器
    void operator()(int value) {
      count = value;
    }
    // 重载带步长的调用
    int operator()(int start, int increment) {
      count = start;
      step = increment;
      return operator()();// 调用无参版本
    }
};
// 调用示例
Counter counter(0, 1);
int val1 = counter();      // 返回 0,count 变为 1
int val2 = counter();      // 返回 1,count 变为 2
counter(10);               // 重置为 10
int val3 = counter(100, 5); // 重置为 100,步长为5,返回100</pre></div>
<p class="maodian"></p><h4>2.2 累加器实现</h4>
<div class="jb51code"><pre class="brush:cpp;">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</pre></div>
<p class="maodian"></p><h3>3. 比较器函数对象</h3>
<p class="maodian"></p><h4>3.1 字符串长度比较器</h4>
<div class="jb51code"><pre class="brush:cpp;">class StringLengthComparator {
public:
    bool operator()(const std::string&amp; a, const std::string&amp; b) const {
      return a.length() &lt; b.length();
    }
};
// 调用示例
std::vector&lt;std::string&gt; strings = {"apple", "banana", "cherry", "date"};
std::sort(strings.begin(), strings.end(), StringLengthComparator());</pre></div>
<p class="maodian"></p><h4>3.2 数值比较器</h4>
<div class="jb51code"><pre class="brush:cpp;">class NumberComparator {
private:
    bool ascending;
public:
    NumberComparator(bool asc = true) : ascending(asc) {}
    bool operator()(int a, int b) const {
      return ascending ? a &lt; b : a &gt; b;
    }
};
// 调用示例
std::vector&lt;int&gt; numbers = {5, 2, 8, 1, 9};
std::sort(numbers.begin(), numbers.end(), NumberComparator(true));   // 升序
std::sort(numbers.begin(), numbers.end(), NumberComparator(false));// 降序</pre></div>
<p class="maodian"></p><h3>4. 算法库中的应用</h3>
<p class="maodian"></p><h4>4.1 自定义谓词函数对象</h4>
<div class="jb51code"><pre class="brush:cpp;">class GreaterThan {
private:
    int threshold;
public:
    GreaterThan(int t) : threshold(t) {}
    bool operator()(int value) const {
      return value &gt; threshold;
    }
};
// 调用示例
std::vector&lt;int&gt; numbers = {1, 5, 3, 8, 2, 9};
int count = std::count_if(numbers.begin(), numbers.end(), GreaterThan(5));
// count = 2 (8, 9)</pre></div>
<p class="maodian"></p><h4>4.2 变换函数对象</h4>
<div class="jb51code"><pre class="brush:cpp;">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&lt;int&gt; input = {1, 2, 3, 4, 5};
std::vector&lt;int&gt; 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}</pre></div>
<p class="maodian"></p><h3>5. 函数对象容器</h3>
<p class="maodian"></p><h4>5.1 操作器容器</h4>
<div class="jb51code"><pre class="brush:cpp;">class OperationContainer {
private:
    std::string operation;
public:
    OperationContainer(const std::string&amp; 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</pre></div>
<p class="maodian"></p><h4>5.2 条件过滤器</h4>
<div class="jb51code"><pre class="brush:cpp;">class Filter {
private:
    std::function&lt;bool(int)&gt; condition;
public:
    Filter(std::function&lt;bool(int)&gt; cond) : condition(cond) {}
    std::vector&lt;int&gt; operator()(const std::vector&lt;int&gt;&amp; input) const {
      std::vector&lt;int&gt; result;
      for (int value : input) {
            if (condition(value)) {
                result.push_back(value);
            }
      }
      return result;
    }
};
// 调用示例
std::vector&lt;int&gt; 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 &gt; 5; });
auto greaterNumbers = greaterFilter(numbers);// {6, 7, 8, 9, 10}</pre></div>
<p class="maodian"></p><h3>6. 高级应用场景</h3>
<p class="maodian"></p><h4>6.1 闭包模拟</h4>
<div class="jb51code"><pre class="brush:cpp;">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)</pre></div>
<p class="maodian"></p><h4>6.2 函数组合器</h4>
<div class="jb51code"><pre class="brush:cpp;">template&lt;typename F, typename G&gt;
class Compose {
private:
    F f;
    G g;
public:
    Compose(F f_func, G g_func) : f(f_func), g(g_func) {}
    template&lt;typename T&gt;
    auto operator()(T x) const -&gt; decltype(f(g(x))) {
      return f(g(x));
    }
};
// 调用示例
auto square = [](int x) { return x * x; };
auto increment = [](int x) { return x + 1; };
Compose&lt;decltype(square), decltype(increment)&gt; compose(square, increment);
int result = compose(5);// 先执行 increment(5) = 6, 再执行 square(6) = 36</pre></div>
<p class="maodian"></p><h3>7. 性能考虑与最佳实践</h3>
<p class="maodian"></p><h4>7.1 const 修饰符使用</h4>
<div class="jb51code"><pre class="brush:cpp;">class StatelessFunction {
public:
    // 无状态函数对象应使用 const 修饰
    int operator()(int x) const {
      return x * 2;
    }
};</pre></div>
<p class="maodian"></p><h4>7.2 引用参数传递</h4>
<div class="jb51code"><pre class="brush:cpp;">class StringProcessor {
public:
    std::string operator()(const std::string&amp; input) const {
      // 使用 const 引用避免拷贝
      return input + "_processed";
    }
};</pre></div>
<p class="maodian"></p><h3>8. 总结</h3>
<ul><li><strong>灵活性</strong>:operator()重载提供了函数对象的灵活性</li><li><strong>状态保持</strong>:函数对象可以维护内部状态</li><li><strong>算法兼容</strong>:与 STL 算法完美配合</li><li><strong>性能优势</strong>:编译时优化,避免函数指针调用开销</li><li><strong>类型安全</strong>:编译时类型检查,避免运行时错误</li></ul>
<p>到此这篇关于C++ 中 operator() 重载详解的文章就介绍到这了,更多相关C++ operator() 重载内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>C++隐式类型转换运算符operator type()用法详解</li><li>C++ operator关键字(重载操作符)的用法详解</li><li>浅谈C++虚重载操作符 virtual operator= 的使用方法</li><li>C++中Operator类型强制转换成员函数解析</li><li>全面解析C++中的new,operator new与placement new</li><li>解析c++中的默认operator=操作的详解</li><li>浅析C++中的函数重载</li><li>深入了解C++函数重载解析策略</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: C++ 中 operator() 重载与最佳实践