如何将运算符重载与友元设计为?
摘要:运算符重载 基本概念 在 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)。
非类成员运算符重载
重载函数作为普通全局函数,需显式声明所有操作数,且至少有一个操作数是自定义类型(否则编译报错)。
