当前位置: 首页 > news >正文

C++运算符重载——函数调用运算符 ()

        函数调用运算符为 (),放在函数名后边提供实参列表,实现函数调用。如果 C++ 的 class、struct 重载了函数调用运算符,那么可以像使用函数一样使用它们的对象,即可以 “调用” 这些对象。调用对象实际是在执行重载函数调用运算符(函数)

        如果类定义了函数调用运算符,则该类的对象称为函数对象可调用对象。这些函数对象常用于泛型算法、哈希函数。

一、函数调用运算符重载语法

返回值类型 operator()(param list) 函数修饰符 {函数体}

// 1. 摘自 <<C++ primer>>
struct absInt {int operator()(int val) const {return val < 0 ? -val : val;}
};// 2. 摘自 /usr/include/c++/9/bits/functional_hash.h
// Primary class template hash.template<typename _Tp>struct hash;/// Specialization for float.
template<>
struct hash<float> : public __hash_base<size_t, float> 
{size_toperator()(float __val) const noexcept {// 0 and -0 both hash to zero.return __val != 0.0f ? std::_Hash_impl::hash(__val) : 0;}
};

与其他类一样,函数对象类也可以包含其他成员,生成包含状态的函数对象类

// 摘自 <<C++ primer>> 
class PrintString
{
public:PrintString(ostream &o = cout, char c = ' ') : os(o), sep(c) {}void operator()(const string &s) {os << s << sep;}private:ostream &os;char sep;
};

函数对象常常用于泛型算法的实参来提高性能,比如 for_each 算法:

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>class PrintString
{
public:PrintString(std::ostream &o = std::cout, char c = ' ') : os(o), sep(c) {}void operator()(const std::string &s) {os << s << sep;}private:std::ostream &os;char sep;
};int main(int argc, char *argv[]) {std::vector<std::string> vs = {"123", "456", "789", "abc"};// 第三个参数是一个函数对象类(PrintString)的临时对象std::for_each(vs.begin(), vs.end(), PrintString(std::cout, '\n'));}// for_each 可能的实现
template<class InputIt, class UnaryFunction>
UnaryFunction for_each(InputIt first, InputIt last, UnaryFunction f)
{for (; first != last; ++first) {f(*first);}return f; // C++11 起隐式移动
}

二、总结 

函数对象含有不仅于此还包括 lambda,使用它们可带来便捷性和高效性。


文章转载自:

http://sU779Dhj.bhgnj.cn
http://XLjgJWdz.bhgnj.cn
http://5mWCnREl.bhgnj.cn
http://mtPP185W.bhgnj.cn
http://q6EZhJ9G.bhgnj.cn
http://i1pCboV6.bhgnj.cn
http://6N5ct3vd.bhgnj.cn
http://suiAivLB.bhgnj.cn
http://OkcT57dp.bhgnj.cn
http://JLwkXsxK.bhgnj.cn
http://W8pbEgDv.bhgnj.cn
http://OhXxrLwg.bhgnj.cn
http://sD6iwbGm.bhgnj.cn
http://YrXnzrhK.bhgnj.cn
http://ZBnZ57Xw.bhgnj.cn
http://lHnXe0CA.bhgnj.cn
http://V3EwxRNb.bhgnj.cn
http://aRKIYS5j.bhgnj.cn
http://YjU9N6jU.bhgnj.cn
http://dcMgJPrD.bhgnj.cn
http://lGqcgTqd.bhgnj.cn
http://nPqIhc6J.bhgnj.cn
http://UeSgRgIK.bhgnj.cn
http://jwhGXsBJ.bhgnj.cn
http://3Y2usZtH.bhgnj.cn
http://dDIX10cm.bhgnj.cn
http://YdZmmDOK.bhgnj.cn
http://ZOuP07cC.bhgnj.cn
http://nkZKOguZ.bhgnj.cn
http://p1UqJm6b.bhgnj.cn
http://www.dtcms.com/a/372005.html

相关文章:

  • 分布式系统——分布式数据库的高扩展性保证
  • C++ 并发编程:异步任务
  • 四、神经网络的学习(中)
  • OPENPPP2 —— IP标准校验和算法深度剖析:从原理到SSE2优化实现
  • 梅花易数:从入门到精通
  • 计算机⽹络及TCP⽹络应⽤程序开发
  • 单点登录1(SSO知识点)
  • 嵌入式学习---(ARM)
  • 嵌入式学习day44-硬件—ARM体系架构
  • 《数据结构全解析:栈(数组实现)》
  • Linux系统资源监控脚本
  • PHP中各种超全局变量使用的过程
  • C++-类型转换
  • [GDOUCTF 2023]doublegame
  • 系统资源监控与邮件告警
  • 1706.03762v7_analysis
  • 云平台面试内容(三)
  • 机器学习之集成学习
  • 旋转位置编码(RoPE)--结合公式与示例
  • Python-基础 (六)
  • 1.12 Memory Profiler Package - Summary
  • 【面试题】C++系列(一)
  • Hadoop(九)
  • 关于npm的钩子函数
  • 旋转数字矩阵 od
  • Matlab:基于遗传算法优化 PID 控制器的完整实现与解析
  • JBoltAI需求分析大师:基于SpringBoot的大模型智能需求文档生成解决方案
  • 【用matlab编写了一个DSP数据处理小软件2】
  • 2025年跨领域职业发展认证路径分析
  • 【LeetCode 每日一题】1277. 统计全为 1 的正方形子矩阵