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

C++迈向精通:函数指针对象与函数对象

C++:指针对象

C语言中的函数指针

在C语言中,我们见过如下的函数指针:

int add(int a, int b) {return a + b;
}int main() {int a, b;int (*p)(int, int) = add;scanf("%d%d", &a, &b);p(a, b);return 0;
} 

为了适应C++中面向对象的特性,出现了一个新的对象叫做函数指针对象。

C++中的函数指针对象

C++中的函数对象

在C++中有一类对象本质上是一个对象,但是表现的像个函数:

class Func_add {
public:int operator+()(int a, int b) {return a + b;}
};int main() {Func_add add; // 需要先定义一个函数对象int a , int b;cin >> a >> b;cout << "a + b = " << add(a, b) << endl;return 0;
}

既然有函数对象,可以猜到C语言中的函数指针肯定不能不能指向C++中的函数对象,因此诞生出了函数指针对象,既能够满足原生C语言中的函数指针的要求,也能满足C++中函数对象的要求:


#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <cstdio>
#include <cstdlib>
#include <ctype.h>
#include <cmath>
#include <string>
#include <sstream>
#include <functional>#define TEST_BEGINS(x) namespace x {
#define TEST_ENDS(x) } // end of namespace x
using namespace std;int add(int a, int b) {return a + b;
}class func{
public:int operator()(int a, int b) {return a + b;}};int main() {int a, b;func func_add;cin >> a >> b;function<int(int, int)> q;q = add;cout << q(a, b) << endl;q = func_add;cout << q(a, b) << endl;return 0;
}

可以看出函数对象都能执行成功。

函数指针对象的用法

很简单,你可以将他当成一个指针来使用,包括赋值一系列操作。

functional<int(int ,int)> q; // 定义了一个具有两个参数int和一个int返回值的函数指针对象;
functional<float(int, float)> p; // 定义了两个传入参数类型分别是 int 和 float 类型,返回值类型是float类型的函数指针对象

C++_STL中的函数对象

那么C++中有什么函数对象呢?其中最为常用的大概就是greater了,他常常在sort函数的排序中作为第三个参数来使用:

srand(time(0));
vector<int> a;
for (int i = 0; i < 100; ++i) {a.push_back(rand() % 100);
}
sort(a.begin(), a.end(), greater<int>());

事实上,这个对象是被当作一个比较方法来使用的。

greater复现

我们可以尝试写一下greater的代码:


TEST_BEGINS(my)
template <typename T>
class greater {
public:bool operator()(T a, T b) {if (a > b) return true;else return false;}
};
TEST_ENDS(my)

只要是能够使用比较运算符的对象就可以使用该比较方法。

相关文章:

C++迈向精通:函数指针对象与函数对象

C&#xff1a;指针对象 C语言中的函数指针 在C语言中&#xff0c;我们见过如下的函数指针&#xff1a; int add(int a, int b) {return a b; }int main() {int a, b;int (*p)(int, int) add;scanf("%d%d", &a, &b);p(a, b);return 0; } 为了适应C中面向…...

类和对象知识点

面向对象概念回顾 万物皆对象 用程序来抽象&#xff08;形容&#xff09;对象 用面向对象的思想来编程 什么是类 基本概念 具有相同特征&#xff0c;具有相同行为&#xff0c;一类事物的抽象。 类是对象的模板&#xff0c;可以通过类创建出对象&#xff0c;类的关键词—…...

【FAS】《Survey on face anti-spoofing in face recognition》

文章目录 原文基于手工设计特征表达的人脸活体检测方法基于深度学习的人脸活体检测方法基于融合策略的人脸活体检测方法人脸检测活体数据库点评 原文 邓雄,王洪春,赵立军等.人脸识别活体检测研究方法综述[J].计算机应用研究,2020,37(09):2579-2585.DOI:10.19734/j.issn.1001-3…...

【Unity】RPG2D龙城纷争(一)搭建项目、导入框架、前期开发准备

更新日期&#xff1a;2024年6月12日。 项目源码&#xff1a;后续章节发布 免责声明&#xff1a;【RPG2D龙城纷争】使用的图片、音频等所有素材均有可能来自互联网&#xff0c;本专栏所有文章仅做学习和教程目的&#xff0c;不会将任何素材用于任何商业用途。 索引 【系列简介】…...

多目标跟踪中检测器和跟踪器如何协同工作的

多目标跟踪中检测器和跟踪器如何协同工作的 flyfish 主要是两者 接口间的交互 假设 原始图像尺寸&#xff1a;1920&#xff08;宽&#xff09;x 1080&#xff08;高&#xff09; 模型输入尺寸&#xff1a;640&#xff08;宽&#xff09;x 640&#xff08;高&#xff09; 检…...

kali系统几个开机启动项的区别

1、Live system (amd64) 简单的模式 &#xff0c;启动系统&#xff0c;直接进入 Kali&#xff0c;在系统中的所有的操作和设置都会在下次重启时失效。 Kali 中保存/编辑的所有东西都会重启丢失。 2、Live system (amd64 fail-safe mode) 这种模式与 Live (amd64) 类似&#xf…...

【自撰写】【国际象棋入门】第5课 常见开局战术组合(一)

第5课 常见开局战术组合&#xff08;一&#xff09; 本次课中&#xff0c;我们简要介绍几种常见的开局战术组合。开局当中&#xff0c;理想的情况是&#xff0c;己方的两只&#xff08;或以上&#xff09;轻子相互配合&#xff0c;或者与己方的兵配合&#xff0c;在完成布局的…...

高考志愿填报选专业,女孩就业率最好的专业有哪些?

高考志愿填报选专业&#xff0c; 大家都会关心&#xff1a;将来怎么就业&#xff1f; 按照目前的环境来说&#xff0c;女孩的就业是不乐观的&#xff0c;在职场上&#xff0c;绝大部分岗位都是男性优先的&#xff0c;至少短期内可能还无法改变&#xff0c;这样就要求我们在大学…...

yolov5模型训练早停模型变大

目录 1. 背景2. 原因分析2.1 train代码分析2.2 strip_optimizer函数分析 3. 验证 1. 背景 最近使用tph-yolov5训练yolov5l-tph-plus模型时&#xff0c;发现模型收敛的差不多了&#xff0c;就果断的停止了训练&#xff0c;结果发现last.pt和best.pt竟然488M&#xff0c;而正常训…...

next是什么???

大家都知道最近出了一个很火的框架&#xff0c;Next.js框架。很多大公司&#xff08;例如&#xff1a;Tencent腾讯&#xff0c;docker&#xff0c;Uber&#xff09;的项目都在使用这个Next.js框架。那Next.js到底是一个什么框架呢&#xff1f;Next.js有什么优点呢&#xff1f;今…...

K8s的资源对象

资源对象是 K8s 提供的一些管理和运行应用容器的各种对象和组件。 Pod 资源是 K8s 中的基本部署单元&#xff0c;K8s通过Pod来运行业务应用的容器镜像 Job 和 CronJob 资源用于执行任务和定时任务&#xff0c;DaemonSet 资源提供类似每个节点上守护进程&#xff0c; Deployment…...

OpenStack快速入门

任务一 熟悉OpenStack图形界面操作 1.1 Horizon项目 •各OpenStack服务的图形界面都是由Horizon提供的。 •Horizon提供基于Web的模块化用户界面。 •Horizon为云管理员提供一个整体的视图。 •Horizon为终端用户提供一个自主服务的门户。 •Horizon由云管理员进行管理…...

STM32CubeIDE对STM32F072进行ADC配置及使用

目录 1. 配置2. 时钟3. ADC配置4. 代码补充 1. 配置 引脚配置&#xff1a;PB0 2. 时钟 都是48MHz 3. ADC配置 ADC配置&#xff1a; 开启中断&#xff1a; 4. 代码补充 轮训ADC采样&#xff1a; HAL_ADC_PollForConversion(&hadc,10);ADC采样&#xff1a; HAL_ADC_Start (&a…...

Leetcode Hot 100 刷题记录 - Day 1

问题描述&#xff1a; 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。 示…...

k8s学习--Kruise Rollouts 基本使用

文章目录 Kruise Rollouts简介什么是 Kruise Rollouts&#xff1f;核心功能 应用环境一、OpenKruise部署1.安装helm客户端工具2. 通过 helm 安装 二、Kruise Rollouts 安装2. kubectl plugin安装 三、Kruise Rollouts 基本使用(多批次发布)1. 使用Deployment部署应用2.准备Roll…...

PHP框架详解 - CakePHP框架

CakePHP 是一个开源的 PHP Web 应用框架&#xff0c;它遵循 MVC&#xff08;模型-视图-控制器&#xff09;设计模式。CakePHP 提供了快速开发的功能&#xff0c;如代码自动生成、数据库交互的 CRUD 操作支持、灵活的路由、模板引擎、表单处理以及其它许多有用的特性22。 CakeP…...

el-cascader 支持多层级,多选(可自定义限制数量),保留最后一级

多功能的 el-cascader 序言&#xff1a;最近遇到一个需求关于级联的&#xff0c;有点东西&#xff0c;这里是要获取某个产品类型下的产品&#xff0c;会存在产品类型和产品在同一级的情况&#xff0c;但是产品类型不能勾选&#xff1b; 情况1&#xff08;二级菜单是产品&…...

leetcode498 对角线遍历

题目 给你一个大小为 m x n 的矩阵 mat &#xff0c;请以对角线遍历的顺序&#xff0c;用一个数组返回这个矩阵中的所有元素。 示例 输入&#xff1a;mat [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,4,7,5,3,6,8,9] 解析 本题目主要考察的就是模拟法&#xff0c;首…...

北京活动会议通常会邀约哪些媒体参会报道?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 北京作为我国的首都和文化中心&#xff0c;各类活动会议资源丰富&#xff0c;吸引了众多媒体的关注。以下是一些通常会被邀约参会报道的重要媒体类型&#xff1a; 国家级新闻机构&#x…...

随心笔记,第六更

目录 一、 三步构建 XML转成java bean 1.XML转XSD 2.XSD转JavaBean 3.jaxb 工具类 4.测试 &#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「Leen」。刚工作几年&#xff0c;想和大家一同进步&am…...

zustand 状态管理库的使用 结合TS

zustand 是一个用于React应用的简单、快速且零依赖的状态管理库。它使用简单的钩子&#xff08;hooks&#xff09;API来创建全局状态&#xff0c;使得在组件之间共享状态变得容易。 React学习Day10 基本用法 安装&#xff1a;首先&#xff0c;你需要安装zustand库。 npm insta…...

Maven 的生命周期详解

Maven 是目前最流行的项目管理和构建工具之一&#xff0c;广泛应用于 Java 开发项目中。它通过一系列约定和配置&#xff0c;极大地简化了项目的构建、依赖管理和生命周期管理。其中&#xff0c;Maven 的生命周期是其核心概念之一&#xff0c;贯穿了项目从构建、测试、打包到部…...

【稳定检索/投稿优惠】2024年生物技术与食品科学国际会议(ICBFS 2024)

2024 International Conference on Biotechnology and Food Science 2024年生物技术与食品科学国际会议 【会议信息】 会议简称&#xff1a;ICBFS 2024 大会时间&#xff1a;点击查看 截稿时间&#xff1a;点击查看 大会地点&#xff1a;中国厦门 会议官网&#xff1a;www.icb…...

iOS Category

原理&#xff1a; 【iOS】——分类、扩展和关联对象_ios 为什么分类不能加成员变量-CSDN博客 面试题&#xff1a; 1.Category和Extension区别&#xff1f; 在 Objective-C 中&#xff0c;Category 和 Extension 是两种用于向现有类添加新功能的机制&#xff0c;但它们各有特…...

5.Sentinel入门与使用

5.Sentinel入门与使用 1.什么是 Sentinel?Sentinel 主要有以下几个功能: 2.为什么需要 Sentinel?3.Sentinel 基本概念3.1 什么是流量控制?3.1.1 常见流量控制算法3.1.2 Sentinel 流量控制流控效果介绍如下: 3.2 什么是熔断?熔断策略 3.3 Sentinel 组成&#xff08;资源和规…...

上位机图像处理和嵌入式模块部署(h750 mcu和图像处理)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;h750和之前的103、407相比较&#xff0c;本身cpu频率比较高&#xff0c;flash大小一般&#xff0c;但是ram比较大&#x…...

信创服务器操作系统的适配迁移分析

浅谈信创服务器操作系统的适配迁移 01 服务器操作系统迁移适配流程复杂 随着CentOS停服临近和红帽RHEL源码权限受限&#xff0c;服务器操作系统安全漏洞风险加剧。国内众多企业面临CentOS、REHL等系统升级替换的挑战。同时&#xff0c;出于安全、功能升级和合规需求&#xff0…...

在Ubuntu 20.04上安装和配置MySQL 8:详细指南和远程访问设置

目录 一、MySQL 8的特点和优势 二、在Ubuntu 20.04上安装MySQL 8 三、初始化MySQL 四、配置MySQL远程访问 五、 创建远程访问用户 六. 配置防火墙 七、 测试远程访问 总结 MySQL是一种开源的关系型数据库管理系统&#xff0c;被广泛应用于各种应用程序和网站中。MySQL …...

Vue43-单文件组件

一、脚手架的作用 单文件组件&#xff1a;xxx.vue&#xff0c;浏览器不能直接运行&#xff01;&#xff01;&#xff01; 脚手架去调用webpack等第三方工具。 二、vue文件的命名规则 建议用下面的两种方式。&#xff08;首字母大写&#xff01;&#xff01;&#xff01;&#x…...

如何快速使用向量检索服务DashVector?

免费体验阿里云高性能向量检索服务&#xff1a;https://www.aliyun.com/product/ai/dashvector 本文将介绍如何快速上手使用向量检索服务DashVector。 前提条件 已创建Cluster&#xff1a;创建Cluster。 已获得API-KEY&#xff1a;API-KEY管理。 已安装最新版SDK&#xff1a…...

网站空间关闭了怎么办/爱站seo工具包官网

Web 前端学习 之jQuery基本过滤器 介绍 基本过滤器 first last not() even 偶数 odd 奇数 eq equal 等于 gt greater than 大于 lt less than 小于 header 标题 animated 正在执行动画效果 案例 需求如下 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"…...

怎么举报app软件/广州网站优化

关于Spring Boot后台运行的一些配置方式。在介绍后台运行配置之前&#xff0c;我们先回顾一下Spring Boot应用的几种运行方式&#xff1a; 运行Spring Boot的应用主类使用Maven的Spring Boot插件mvn spring-boot:run来运行打成jar包后&#xff0c;使用java -jar运行我们在开发的…...

给帅哥做奴视频网站地址/seo关键词优化价格

即子组件向父组件传值 要点有三&#xff1a; 1. 需要在子组件使用 this.triggerEvent(changeName, {name: 李四})}方法来进行参数的传递 2. 需要在父组件 引用子组件的地方 进行方法监听 子组件triggerEvent触发的事件名&#xff0c;需要和父组件引用子组件处&#xff0c;…...

设计网站国外/百度搜索工具

http://outofmemory.cn/code-snippet/3762/Spring-AOP-learn-example 工作忙&#xff0c;时间紧&#xff0c;不过事情再多&#xff0c;学习是必须的。记得以前的部门老大说过&#xff1a;“开发人员不可能一天到晚只有工作&#xff0c;肯定是需要自我学习。第一&#xff1a;为了…...

网站开发论文近三年的参考文献/东莞seo黑帽培训

首先我们来梳理下逻辑&#xff1b; 例如&#xff1a; 新建了一个名为lanmu(栏目)的控制器&#xff0c; 控制器下面有个index的Action(方法), 我们在方法上添加一个视图后&#xff0c;该视图对应的是控制器lanmu下面的index方法&#xff1b; 但是我们在实际操作的时候&#xff0…...

青海建设网站多少钱/外贸推广平台排名

大家在使用Silverlight开发的过程中&#xff0c;一定遇到过集合List、ObservableCollection和接口INotifyPropertyChanged&#xff0c;特别是集合List、ObservableCollection会经常遇到&#xff0c;但是大家有没有想到过他们之间的区别吗?大家一定知道在引用WCF的时候&#xf…...