Bootstrap

C++操作符重载案例

        在学习ZLToolKit源码时,发现代码中涉及好多运算符重载,因此对其做一下归类学习。

        直接写一个代码案例如下:

#include <iostream>
#include <memory>
#include <functional>

// 定义类 A
class A {
public:
    A(int a) { _a = a;  }

    // 重载()
    std::string operator()(std::string s) {
        std::cout << "-----operator () -----" << std::endl;
        return s;
    }

    // 重载bool类型
    operator bool() {
        std::cout << "-----operator bool -----" << std::endl;
        return _a > 0;
    }

    // 重载int类型
    operator int() {
        std::cout << "-----operator int -----" << std::endl;
        return _a;
    }

    // 重载=运算法,入参(被赋值类型int)
    A operator= (int a) {
        std::cout << "-----operator =(int) -----" << std::endl;
        _a = a;
        return *this;
    }

    // 重载=运算法,入参(被赋值类型A)
    A operator= (A a) {
        std::cout << "-----operator =(A) -----" << std::endl;
        _a = a._a;
        return *this;
    }

    // 重载函数指针,将类对象当做一个函数指针调用。也可以通过重载()实现
    using func = int (*)(int, int);
    operator func() {
        std::cout << "-----operator func -----" << std::endl;
        // 返回的函数地址必须是类的静态成员函数地址
        return myfunc;
    }

    static int myfunc(int a, int b) {
        return a + b;
    }

private:
    int _a;
};

int main() {
    // 创建类 A 的实例
    A a(100), b(100), c(100);

    // 调用重载bool类型函数
    if (a) {
        // 调用重载int类型函数
        std::cout << (int)a  << std::endl;
        // 调用重载bool类型函数
        std::cout << (bool)a << std::endl;
    }
    
    // 调用重载=(int)运算法
    b = 222;

    // 调用重载int类型函数
    std::cout << (int)b << std::endl;

    // 调用重载=(A)运算法
    a = b;
    // 调用重载int类型函数
    std::cout << (int)a << std::endl;

    // 先调用重载=(int)运算法,再调用重载=(A)运算法
    c = b = 300;
    // 调用重载int类型函数
    std::cout << (int)c << std::endl;

    // 调用重载()运算符
    std::cout << c("this is test") << std::endl;

    // 调用重载函数指针
    int sum = c(12, 13);
    std::cout << sum << std::endl;
    return 0;
}

执行结果分析如下: