+
運算子完成,不是很直觀和簡潔嗎?+
將兩個複數物件相加這樣的問題。
返回值型別 operator 運算子(形參表)
{
....
}
#include <iostream> using namespace std; class Complex { public: double real, imag; Complex(double r = 0.0, double i = 0.0) : real(r), imag(i) { } Complex operator - (const Complex & c); }; Complex operator + (const Complex & a, const Complex & b) { return Complex(a.real + b.real, a.imag + b.imag); //返回一個臨時物件 } Complex Complex::operator - (const Complex & c) { return Complex(real - c.real, imag - c.imag); //返回一個臨時物件 } int main() { Complex a(4, 4), b(1, 1), c; c = a + b; //等價於 c = operator + (a,b); cout << c.real << "," << c.imag << endl; cout << (a - b).real << "," << (a - b).imag << endl; //a-b等價於a.operator - (b) return 0; }程式的輸出結果是:
+
過載為一個全域性函數(只是為了演示這種做法,否則過載為成員函數更好),將-
過載為一個成員函數。+
沒有被過載,第 21 行會編譯出錯,因為編譯器不知道如何對兩個 Complex 物件進行+
運算。有了對+
的過載,編譯器就將a+b
理解為對運算子函數的呼叫,即operator+(a,b)
,因此第 21 行就等價於:
c = operator+(a, b);
即以兩個運算元 a、b 作為引數呼叫名為operator+
的函數,並將返回值賦值給 c。-
被過載為 Complex 類的成員函數,因此,第 23 行中的a-b
就被編譯器處理成:
a.operator-(b);
由此就能看出,為什麼運算子過載為成員函數時,引數個數要比運算子目數少 1 了。