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