C++ operator()

devtools/2024/11/12 1:57:50/

operator_0">C++ operator()

flyfish

运算符重载

  • C++ operator()
    • 仿函数 (Functors):用来封装函数或行为,使对象可以像函数一样调用
    • 复杂点的仿函数:定义了一个 `MultiplyBy` 仿函数类,它的 `operator()` 运算符将输入的整数乘以一个因子
    • 定义了一个 `Event` 类,它管理一个回调函数
    • 有参数的调用运算符>函数调用运算符
    • 多个参数的调用运算符>函数调用运算符
    • 重载数组下标运算符
    • 算术运算符** (`+`, `-`, `*`, `/`)
    • 比较运算符** (`==`, `!=`)
    • 输入输出运算符** (`<<`, `>>`)

operator() 是C++中的一种运算符重载,称为调用运算符>函数调用运算符调用运算符

仿函数 (Functors):用来封装函数或行为,使对象可以像函数一样调用

以下是一个简单的示例,展示了如何使用 operator()

#include <iostream>// 定义一个类
class Functor {
publicoperator">:// 重载调用运算符>函数调用运算符void operator()() {std::cout operator"><< "Functor 被调用了!" operator"><< std::endl;}
};int main() {Functor functor; // 创建 Functor 对象functor(); // 调用对象,就像调用函数一样return 0;
}

operator__31">复杂点的仿函数:定义了一个 MultiplyBy 仿函数类,它的 operator() 运算符将输入的整数乘以一个因子

使用 std::transform 算法将 vec 中的每个元素乘以 3

#include <iostream>
#include <vector>
#include <algorithm>// 定义一个仿函数类
class MultiplyBy {int factor;
publicoperator">:MultiplyBy(int f) operator">: factor(f) {}// 重载调用运算符>函数调用运算符int operator()(int x) const {return x operator">* factor;}
};int main() {std::vectoroperator"><intoperator">> vec operator">= {1, 2, 3, 4, 5};// 使用仿函数将每个元素乘以 3std::transform(vec.begin(), vec.end(), vec.begin(), MultiplyBy(3));for (int val operator">: vec) {std::cout operator"><< val operator"><< " ";}return 0;
}

定义了一个 Event 类,它管理一个回调函数

回调函数是一种通过函数指针或仿函数在特定事件发生时调用的函数。

trigger 方法被调用时,它会调用设置的回调函数。使用 Callback 仿函数作为回调函数,并在 main 函数中触发事件。

#include <iostream>
#include <functional>// 定义一个回调管理类
class Event {std::functionoperator"><void()operator">> callback;
publicoperator">:void setCallback(std::functionoperator"><void()operator">> cb) {callback operator">= cb;}void trigger() {if (callback) {callback();}}
};// 定义一个仿函数类
class Callback {
publicoperator">:void operator()() const {std::cout operator"><< "回调函数被调用了!" operator"><< std::endl;}
};int main() {Event event;Callback callback;// 设置回调函数event.setCallback(callback);// 触发事件,调用回调函数event.trigger();return 0;
}

有参数的调用运算符>函数调用运算符

你可以定义带参数的 operator(),如下所示:

class Adder {int increment;
publicoperator">:Adder(int inc) operator">: increment(inc) {}int operator()(int x) const {return x operator">+ increment;}
};int main() {Adder adder(5);std::cout operator"><< adder(10) operator"><< std::endl; // 输出 15return 0;
}

多个参数的调用运算符>函数调用运算符

调用运算符>函数调用运算符 operator() 的语法要求使用一对括号。内部的参数列表括号可以包含任意数量的参数,但调用运算符>函数调用运算符本身只有一对外括号。

class Multiplier {
publicoperator">:int operator()(int a, int b) const {return a operator">* b;}
};int main() {Multiplier multiplier;std::cout operator"><< multiplier(3, 4) operator"><< std::endl; // 输出 12return 0;
}

重载数组下标运算符

class Array {int data[10];
publicoperator">:Array() {for (int i operator">= 0; i operator">< 10; operator">++i) {data[i] operator">= i;}}intoperator">& operator[](int index) {return data[index];}
};int main() {Array arr;arr[5] operator">= 100; // 使用重载的数组下标运算符std::cout operator"><< "arr[5] = " operator"><< arr[5] operator"><< std::endl; // 输出 arr[5] = 100return 0;
}

算术运算符** (+, -, *, /)

class Complex {double real, imag;
publicoperator">:Complex(double r, double i) operator">: real(r), imag(i) {}// 重载加法运算符Complex operatoroperator">+(const Complexoperator">& other) const {return Complex(real operator">+ other.real, imag operator">+ other.imag);}void print() const {std::cout operator"><< "(" operator"><< real operator"><< ", " operator"><< imag operator"><< "i)" operator"><< std::endl;}
};int main() {Complex a(1.0, 2.0);Complex b(3.0, 4.0);Complex c operator">= a operator">+ b; // 使用重载的加法运算符c.print(); // 输出 (4.0, 6.0i)return 0;
}

比较运算符** (==, !=)

class Complex {double real, imag;
publicoperator">:Complex(double r, double i) operator">: real(r), imag(i) {}// 重载等于运算符bool operatoroperator">==(const Complexoperator">& other) const {return real operator">== other.real operator">&& imag operator">== other.imag;}
};int main() {Complex a(1.0, 2.0);Complex b(1.0, 2.0);if (a operator">== b) {std::cout operator"><< "a and b are equal" operator"><< std::endl;}return 0;
}

输入输出运算符** (<<, >>)

#include <iostream>class Complex {double real, imag;
publicoperator">:Complex(double r, double i) operator">: real(r), imag(i) {}// 重载输出运算符friend std::ostreamoperator">& operatoroperator"><<(std::ostreamoperator">& os, const Complexoperator">& c) {os operator"><< "(" operator"><< c.real operator"><< ", " operator"><< c.imag operator"><< "i)";return os;}
};int main() {Complex a(1.0, 2.0);std::cout operator"><< a operator"><< std::endl; // 输出 (1.0, 2.0i)return 0;
}

http://www.ppmy.cn/devtools/86459.html

相关文章

基于GitHub page和Hexo主题搭建个人博客(win)

1.安装git git官网下载地址&#xff1a;Git - Downloads (git-scm.com) (1)下载&#xff1a;进入官网&#xff0c;选择对应版本下载&#xff0c;得到.exe文件 (2)安装&#xff1a;打开.exe文件&#xff0c;进行如下操作 (3)安装好后&#xff0c;右击鼠标&#xff0c;点击显示…

Python写UI自动化--playwright(pytest.ini配置)

在 pytest.ini 文件中配置 playwright 的选项可以更好地控制测试执行的过程。 在终端输入pytest --help&#xff0c;可以找到playwright的配置参数 目录 1. --browser{chromium,firefox,webkit} 2. --headed 3. --browser-channelBROWSER_CHANNEL 4. --slowmoSLOWMO 5. …

【RabbitMQ】MQ相关概念

一、MQ的基本概念 定义&#xff1a;MQ全称为Message Queue&#xff0c;是一种提供消息队列服务的中间件&#xff0c;也称为消息中间件。它允许应用程序通过读写队列中的消息来进行通信&#xff0c;而无需建立直接的连接。作用&#xff1a;主要用于分布式系统之间的通信&#x…

【JKI SMO】框架讲解(九)

本节内容将演示如何向SMO框架添加启动画面。 1.打开LabVIEW新建一个空白项目&#xff0c;并保存。 2.找到工具&#xff0c;打开SMO Editor。 3.新建一个SMO&#xff0c;选择SMO.UI.Splash。 4. 打开LabVIEW项目&#xff0c;可以看到项目里多了一个SystemSplash类。 打开Process…

Linux 使用技巧及示例

1. 快速切换目录 技巧: 使用别名来快速切换到常用的目录。示例:# 添加到 ~/.bashrc 文件 echo alias myproject"cd /home/user/Projects/my_project" >> ~/.bashrc source ~/.bashrc # 重新加载配置文件使其生效2. 管道和重定向 技巧: 使用管道 (|) 和重定向…

方差与标准差的解释

前言 文中记录了我在学习过程中&#xff0c;针对数据的离散程度所做的一些评价&#xff0c;主要涉及到方差和标准差&#xff0c;下面举了一个简单的例子。在统计学中&#xff0c;方差和标准差是用于衡量一组数据离散程度的重要指标。 一、方差 方差是每个样本值与全体样本值的…

自学网络安全,从小白到大神的破茧之路!

在当今数字化高速发展的时代&#xff0c;网络安全已经成为了至关重要的领域。无论是个人的隐私保护&#xff0c;还是企业、国家的关键信息资产维护&#xff0c;都离不开网络安全的有力保障。出于对这一领域的浓厚兴趣以及对未来职业发展的清晰规划&#xff0c;我毅然决然地踏上…

不同行情下算法的具体使用!

上一篇我们说到了不同公司算法交易的区分&#xff0c;有朋友提出了不同的行情下的算法交易应该怎么使用&#xff0c;小编今天就带大家了解下&#xff01;当然具体实际状况百出&#xff0c;这种可以实际为准&#xff08;韭菜修养全拼实际探讨交流&#xff09;&#xff01; 我们在…