在学习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;
}
执行结果分析如下: