定义
C++11 中,operator 是一个关键字,用于重载运算符。通过重载运算符,您可以定义自定义类型的对象在使用内置运算符时的行为。
operator重载用法一般可以分为以下三类:
- operator可以重载我们运算符“±*/=”等;
- 还可以重载我们的函数调用运算符"operator()";
- 还可以做类型转换运算符
operator重载运算符
常见用法:
#include <iostream> class MyNumber { private: int value; public: MyNumber(int num) : value(num) {} int getValue() const { return value; } // 重载加法运算符 '+' MyNumber operator+(const MyNumber& other) { int sum = value + other.value; return MyNumber(sum); } }; int main() { MyNumber num1(5); MyNumber num2(10); MyNumber sum = num1 + num2; // 使用重载的加法运算符进行相加操作 std::cout << "Sum: " << sum.getValue() << std::endl; return 0; }
可以看到MyNumber sum = num1 + num2;看起来是对象相加,其实是进入了重载的+运算符,相加的是对象中的成员变量。
operator重载函数调用运算符
class Adder { public: int operator()(int a, int b) { return a + b; } }; // 使用函数对象进行加法运算 Adder add; int result = add(3, 4); // 调用 operator(),返回结果 7
看起来add就和函数一样,但其实不然,只是重载函数调用运算符后,可以让实例化的add对象像函数一样使用。这也被称为仿函数(这个词算是非常形象了)。
operator类型转换操作符
类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义将类类型值转变为其他类型值的转换。转换操作符在类定义体内声明,在保留字 operator 之后跟着转换的目标类型。
class MyType { public: using fr_t = void(*)(int); static void func(int a) { std::cout << "the value:" << a << std::endl; } operator fr_t() { // 执行适当的转换操作 // 将 MyType 转换为 fr_t return func;//这里是将函数指针赋给了fr_t } }; // 使用类型转换运算符进行类型转换 MyType obj; obj(2); // 这里涉及到两步动作:一是调用 operator fr_t(),将 obj 转换为 fr_t 类型;二是调用了fr_t(2)
原理:转换函数必须是成员函数,不能指定返回类型,并且形参表必须为空;返回值是隐含的,返回值是与转换的类型相同的,即为上面原型中的函数指针类型fr_t,以及返回的函数func必须对应起来;
obj(2);这行代码的执行过程有点难理解,可分为两步:
- 一是调用 operator fr_t(),将 obj 转换为 fr_t 类型;
- 二是调用了fr_t(2); 这里fr_t函数指针已经指向了func,所以可以直接调用。