三種實現方式對比
- 成員函數:
Complex add(Complex c),調用 a.add(b)。
- 友元函數:
friend Complex add(Complex, Complex),調用 add(a,b),可支援 add(a, 5.0) 等混合類型。
- 運算符重載:
Complex operator+(Complex)(成員)或 friend Complex operator+(Complex, Complex)(友元),調用 a + b,語法最自然。
關鍵代碼片段
class Complex {
double re, im;
public:
Complex(double r=0, double i=0): re(r), im(i) {}
// 成員運算符重載
Complex operator+(const Complex& c) const { return Complex(re+c.re, im+c.im); }
Complex operator+(double d) const { return Complex(re+d, im); }
Complex operator*(const Complex& c) const {
return Complex(re*c.re - im*c.im, re*c.im + im*c.re);
}
// 友元支援雙向隱式轉換
friend Complex operator+(double d, const Complex& c) { return Complex(c.re+d, c.im); }
friend Complex operator+(const Complex& a, const Complex& b) { return Complex(a.re+b.re, a.im+b.im); }
void print() const {
cout << '(' << re << (im>=0?"+":"") << im << 'i' << ')' << endl;
}
};
const 正確性與引用
- 運算符盡量聲明
const,參數用 const& 避免拷貝。
- 友元版
operator+ 允許 double + Complex,成員版只能 Complex + double。
- 乘法同理,友元版更對稱。
測試主函數
int main() {
Complex a(1.5, 23.43), b(12.12, -45.23);
Complex c = a + b; // 成員 operator+
Complex d = 5.0 + a; // 友元 operator+(double, Complex)
Complex e = a * b; // 複數乘法
c.print(); d.print(); e.print();
return 0;
}