跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
C++ 函数调用运算符重载
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{DISPLAYTITLE:C++函数调用运算符重载}} == 简介 == '''函数调用运算符重载'''(也称为'''仿函数'''或'''函数对象''')是C++中一种特殊的运算符重载形式,它允许类的实例像函数一样被调用。通过重载<code>operator()</code>,对象可以具备函数的行为,这在STL算法、回调机制和泛型编程中广泛应用。 == 语法与基本用法 == 函数调用运算符重载的语法如下: <syntaxhighlight lang="cpp"> class ClassName { public: return_type operator()(parameters) { // 实现逻辑 } }; </syntaxhighlight> === 简单示例 === 以下代码展示了一个基本实现: <syntaxhighlight lang="cpp"> #include <iostream> class Adder { public: int operator()(int a, int b) { return a + b; } }; int main() { Adder add; std::cout << add(3, 5); // 输出: 8 return 0; } </syntaxhighlight> == 特性与优势 == * '''状态保持''':与普通函数不同,仿函数可以存储状态(通过成员变量) * '''模板兼容''':可作为模板参数传递 * '''多态性''':可通过继承实现动态行为 === 状态保持示例 === <syntaxhighlight lang="cpp"> class Counter { int count = 0; public: int operator()() { return ++count; } }; int main() { Counter c; std::cout << c() << ", " << c(); // 输出: 1, 2 } </syntaxhighlight> == 实际应用场景 == === STL算法中的使用 === 许多STL算法(如<code>std::sort</code>、<code>std::transform</code>)接受仿函数作为参数: <syntaxhighlight lang="cpp"> #include <algorithm> #include <vector> struct Square { void operator()(int& x) { x *= x; } }; int main() { std::vector<int> v = {1,2,3}; std::for_each(v.begin(), v.end(), Square()); // v变为 {1,4,9} } </syntaxhighlight> === 比较器实现 === 常用于自定义排序规则: <syntaxhighlight lang="cpp"> class CaseInsensitiveCompare { public: bool operator()(const std::string& a, const std::string& b) { return std::lexicographical_compare( a.begin(), a.end(), b.begin(), b.end(), [](char c1, char c2) { return tolower(c1) < tolower(c2); }); } }; </syntaxhighlight> == 高级主题 == === lambda表达式关系 === C++11的lambda本质上是匿名仿函数: <mermaid> graph LR A[lambda] --> B[编译器生成匿名类] B --> C[重载operator()] </mermaid> === 模板仿函数 === 结合模板实现泛型: <syntaxhighlight lang="cpp"> template <typename T> class Multiplier { public: T operator()(const T& a, const T& b) const { return a * b; } }; </syntaxhighlight> == 数学表示 == 对于仿函数<math>F</math>,其调用过程可表示为: <math> F(x_1, x_2, ..., x_n) \rightarrow y </math> 其中<math>x_i</math>为参数,<math>y</math>为返回值。 == 最佳实践 == * 优先使仿函数为'''无状态'''(符合纯函数特性) * 对于简单逻辑,考虑使用lambda表达式 * 重载<code>operator()</code>应为<code>const</code>成员函数(除非需要修改对象状态) == 参见 == * [[C++运算符重载]] * [[C++ lambda表达式]] * [[STL算法]] [[Category:C++编程]] [[Category:运算符重载]] [[Category:编程语言]] [[Category:C++]] [[Category:C++ 运算符重载]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)