C++ operator()

C++ operator()

flyfish

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

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

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

#include <iostream>

// 定义一个类
class Functor {
public:
    // 重载函数调用运算符
    void operator()() {
        std::cout << "Functor 被调用了!" << std::endl;
    }
};

int main() {
    Functor functor; // 创建 Functor 对象
    functor(); // 调用对象,就像调用函数一样
    return 0;
}

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

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

#include <iostream>
#include <vector>
#include <algorithm>

// 定义一个仿函数类
class MultiplyBy {
    int factor;
public:
    MultiplyBy(int f) : factor(f) {}

    // 重载函数调用运算符
    int operator()(int x) const {
        return x * factor;
    }
};

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5};

    // 使用仿函数将每个元素乘以 3
    std::transform(vec.begin(), vec.end(), vec.begin(), MultiplyBy(3));

    for (int val : vec) {
        std::cout << val << " ";
    }

    return 0;
}

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

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

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

#include <iostream>
#include <functional>

// 定义一个回调管理类
class Event {
    std::function<void()> callback;
public:
    void setCallback(std::function<void()> cb) {
        callback = cb;
    }

    void trigger() {
        if (callback) {
            callback();
        }
    }
};

// 定义一个仿函数类
class Callback {
public:
    void operator()() const {
        std::cout << "回调函数被调用了!" << std::endl;
    }
};

int main() {
    Event event;
    Callback callback;

    // 设置回调函数
    event.setCallback(callback);

    // 触发事件,调用回调函数
    event.trigger();

    return 0;
}

有参数的函数调用运算符

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

class Adder {
    int increment;
public:
    Adder(int inc) : increment(inc) {}

    int operator()(int x) const {
        return x + increment;
    }
};

int main() {
    Adder adder(5);
    std::cout << adder(10) << std::endl; // 输出 15
    return 0;
}

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

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

class Multiplier {
public:
    int operator()(int a, int b) const {
        return a * b;
    }
};

int main() {
    Multiplier multiplier;
    std::cout << multiplier(3, 4) << std::endl; // 输出 12
    return 0;
}

重载数组下标运算符

class Array {
    int data[10];
public:
    Array() {
        for (int i = 0; i < 10; ++i) {
            data[i] = i;
        }
    }

    int& operator[](int index) {
        return data[index];
    }
};

int main() {
    Array arr;
    arr[5] = 100; // 使用重载的数组下标运算符
    std::cout << "arr[5] = " << arr[5] << std::endl; // 输出 arr[5] = 100
    return 0;
}

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

class Complex {
    double real, imag;
public:
    Complex(double r, double i) : real(r), imag(i) {}
    
    // 重载加法运算符
    Complex operator+(const Complex& other) const {
        return Complex(real + other.real, imag + other.imag);
    }
    
    void print() const {
        std::cout << "(" << real << ", " << imag << "i)" << std::endl;
    }
};

int main() {
    Complex a(1.0, 2.0);
    Complex b(3.0, 4.0);
    Complex c = a + b; // 使用重载的加法运算符
    c.print(); // 输出 (4.0, 6.0i)
    return 0;
}

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

class Complex {
    double real, imag;
public:
    Complex(double r, double i) : real(r), imag(i) {}
    
    // 重载等于运算符
    bool operator==(const Complex& other) const {
        return real == other.real && imag == other.imag;
    }
};

int main() {
    Complex a(1.0, 2.0);
    Complex b(1.0, 2.0);
    if (a == b) {
        std::cout << "a and b are equal" << std::endl;
    }
    return 0;
}

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

#include <iostream>

class Complex {
    double real, imag;
public:
    Complex(double r, double i) : real(r), imag(i) {}
    
    // 重载输出运算符
    friend std::ostream& operator<<(std::ostream& os, const Complex& c) {
        os << "(" << c.real << ", " << c.imag << "i)";
        return os;
    }
};

int main() {
    Complex a(1.0, 2.0);
    std::cout << a << std::endl; // 输出 (1.0, 2.0i)
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

西笑生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值