💡本筆記內容源自溫宏斌老師的物件導向程式設計OCW。
(一)為什麼需要重載運算元
1.提高可讀性和可維護性:舉例來說,c1 + c2 比 c1.add(c2) 更直觀。
2.提供簡化操作:開發者可以直接對兩個物件進行加減乘除等數學運算。
(二)定義
1.概念上類似重載函式
2.運算元本身就是function的名稱
※複習: 函式若可以重載,表示他有同名的函式,但有不同的回傳型態、不同參數的個數和型態。
(三)重載運算元的方法有二:
重載成員函式 | 重載友緣函式 | |
---|---|---|
重載方法 | 透過member function完成 | 透過外部的friend function完成 |
常用於 | 雙元運算元 | 單元運算元 |
※註1:單元是指只接一個運算子(像是x-=y),雙元指的是後面接了兩個運算子。
※註2:成員函式方便處理雙元運算元,是因為它自帶隱含的 this 指針。實際上,兩者都可以重載單元和雙元運算元。
※註3:如果用member function,當有雙元運算元,第一個運算元會當成呼叫函式的人,所以她只會吃一個參數。若是單元,()裡面就沒有參數。
Friend function因為函式在外面定義,binary吃兩個參數,uniary吃一個參數。
當兩者都吃一個參數時,有可能會混淆member function和friend function,但實際意義上有不同。
1.用成員函式重載(雙元)的例子
class CComplex{
double real, imag;
public:
CComplex(){real = 0; imag=0;}
CComplex(double r, double i){
real=r, imag=i;}
CComplex **cdd**(CComplex & o2);
void display(){...}
};
//將兩個 CComplex 物件相加
CComplex CComplex::**cadd**(CComplex & o2){
CComplex c; c.real=real+o2.real;
c.image=imag+o2.imag, return c;
}
2.用友緣函式重載(雙元)的例子
class CComplex{
double real, imag;
public:
CComplex(){real = 0; imag=0;}
CComplex(double r, double i){
real=r, imag=i;}
**friend** CComplex operator+(CComplex & o1,CComplex & o2);
void display(){...}
};
CComplex operator+(CComplex & o1,CComplex & o2){
return CComplex(o1.real+o2.real, o1.imag+02.imag)
}
(四)可以重載的運算元包含:
(四)不能重載的,不然運算上會出問題⭐⭐
目前無
i/o stream、file stream、string stream