如何将运算符重载与友元设计为?

摘要:运算符重载 基本概念 在 C++ 中,当操作数包含类对象时,运算符操作本质是调用对应的函数(称为“运算符重载函数”)。 核心逻辑 示例:A a, b; a + b; 等价于 a.oper
运算符重载 基本概念 在 C++ 中,当操作数包含类对象时,运算符操作本质是调用对应的函数(称为“运算符重载函数”)。 核心逻辑 示例:A a, b; a + b; 等价于 a.operator+(b); 特殊规则:赋值运算符(=)是类的默认成员函数,无需手动定义即可使用;其余大多数运算符(+、<<、++ 等)需手动重载才能用于类对象,否则编译报错。 函数本质:运算符重载函数的函数名为 operator+(+ 为要重载的运算符),格式与普通函数一致,包含返回值类型、参数列表。 声明格式示例 class A { public: A& operator+(const A& r); // 加法运算符重载声明 // 返回值类型:A&(对象引用) // 函数名:operator+ // 参数列表:const A& r(右侧操作数,左侧操作数为调用对象本身) }; 运算符重载分类与示例 运算符重载分为「类成员函数重载」和「非类成员函数重载」两类,核心区别在于函数归属与参数传递方式。 类成员运算符重载 重载函数作为类的成员函数,左侧操作数为调用函数的类对象(隐含 this 指针),仅需在参数列表中声明右侧操作数。 经典示例:时间类(Time)的加法重载 #include <iostream> using namespace std; class Time { private: int hour; // 小时 int minute; // 分钟 int second; // 秒 public: // 构造函数 Time(int h = 0, int m = 0, int s = 0) : hour(h), minute(m), second(s) {} // 加法运算符重载(类成员函数) const Time operator+(const Time& r); // 显示时间(辅助函数) void show() const { cout << hour << ":" << minute << ":" << second << endl; } }; // 加法运算符重载实现(处理时间进位逻辑) const Time Time::operator+(const Time& r) { Time tmp; // 秒数相加,处理进位 tmp.second = this->second + r.second; if (tmp.second >= 60) { tmp.minute++; tmp.second -= 60; } // 分钟相加,处理进位 tmp.minute = this->minute + r.minute; if (tmp.minute >= 60) { tmp.hour++; tmp.minute -= 60; } // 小时相加,处理24小时制 tmp.hour = this->hour + r.hour; tmp.hour %= 24; return tmp; } // 测试代码 int main(void) { Time t1(2, 10, 20); Time t2(4, 12, 51); Time t = t1 + t2; // 等价于 t1.operator+(t2) t.show(); // 输出:6:23:11 return 0; } 语法重点 左操作数隐含:t1 + t2 中,t1 是调用对象(this 指向 t1),t2 是参数列表中的右侧操作数。 等价转换:t1 + t2 ↔ t1.operator+(t2);t2 + t1 ↔ t2.operator+(t1)。 非类成员运算符重载 重载函数作为普通全局函数,需显式声明所有操作数,且至少有一个操作数是自定义类型(否则编译报错)。
阅读全文