class Date {
int y, m, d;
friend ostream& operator<<(ostream& os, const Date& dt);
friend istream& operator>>(istream& is, Date& dt);
};
ostream& operator<<(ostream& os, const Date& dt) {
return os << dt.y << '-' << dt.m << '-' << dt.d;
}
istream& operator>>(istream& is, Date& dt) {
char c;
return is >> dt.y >> c >> dt.m >> c >> dt.d;
}
class Complex {
double re, im;
public:
friend Complex operator+(const Complex& a, const Complex& b) {
return {a.re + b.re, a.im + b.im};
}
friend Complex operator-(const Complex& a, const Complex& b) {
return {a.re - b.re, a.im - b.im};
}
// 複合賦值作為成員
Complex& operator+=(const Complex& rhs) {
re += rhs.re; im += rhs.im; return *this;
}
// + 利用 += 實現
friend Complex operator+(Complex lhs, const Complex& rhs) {
return lhs += rhs;
}
};
class Date {
int y, m, d;
public:
friend bool operator==(const Date& a, const Date& b) {
return a.y==b.y && a.m==b.m && a.d==b.d;
}
friend bool operator<(const Date& a, const Date& b) {
if (a.y != b.y) return a.y < b.y;
if (a.m != b.m) return a.m < b.m;
return a.d < b.d;
}
// C++20 可用 <=> 自動生成其餘
};
// C++20
#include <compare>
class Date {
int y, m, d;
public:
auto operator<=>(const Date&) const = default; // 自動生成 ==, !=, <, <=, >, >=
};
| 運算符 | 成員/非成員 | 備註 |
|---|---|---|
| = [] () -> | 必須為成員 | |
| << >> | 必須為非成員 | 左操作數是流 |
| + - * / % ^ & | ~ ! | 建議非成員 | 支持隱式轉換 |
| == != < <= > >= | 建議非成員 | 保持對稱性 |
| += -= *= ... | 建議成員 | 修改左操作數 |
| ++ -- | 成員 | 前置返回引用,後置返回值 |
運算符重載是 C++ 表達能力的核心,遵循「語義一致、對稱性、最小驚訝原則」,能讓自定義類型像內建類型一樣自然易用。