pass by Val, pass by Ref
Ops Overload = func Overload 所謂運算子多載,其實就是說類別中的多個方法,多載的英文 overload,即類別聆聽到輸入的參數個數,配合約束型別限制的引數(特定型別),而選用適用的運算式。(編譯器會利用 overload resolution rule 判別檢驗運算式)
然而,運算子仍然不能視為成員函數,尤其是第一個運算元為內建型別時。
運算子函數必須遵從兩項規則的其中一項:
需要成為成員函數。(scope 作用域在類別中)
至少帶有一個 self-defined 的 Argument。
將(輸入) -> 輸出 (輸入的型別 輸入):輸出的型別範例:
enum DaysRemain { 1125, 1126, 1127}; DaysRemain& operator++(DaysRemain& date) { return dr = (1127==date) ? 1125 : static_cast<DaysRemain>(date+1); }在程式設計中,當我們意圖要 define ops,初衷其實是要為 Class 或是 Structure 提供一慣用寫法,例如 a=b+c,故針對引數 Argument 傳入運算子函數
適用於小型物件,1 到 4 個字組,推薦使用,因於存取效能會比 pass by ref 還快。
範例:
void Point::operator+=(Point data);適用於大型物件,例如 Matrix 矩陣的物件或是 Array 陣列的物件,亦適合 LinkedList 串列的物件。但仍然不推薦使用此種方式傳遞物件,可以用取代方案:
參照傳遞的範例:
by by const ref
Matrix operator+(const Matrix&, const Matrix&); // 利用 const reference 傳遞物件資訊return by ref
// return 是 & 參照(記憶體位址) int& INT::operator+= int(const int& i) { int* j = elem; int* k = i.elem; *j++ += *k++; return *this; }取代方案:
定義搬移數值的函數 Matrix operator+(const Matrix& a, const Matrix& b) { Matrix res {a}; return res+=b; }基本上,運算子均會回傳結果值,可能傳回物件* 或是參照,但設計這樣的回傳型態,其實不是很好的做法,因為指標 * 會產生寫法問題,而利用指標 * 或是參照 ref 引用位於 free store 自由空間上的物件,會導致 HeapDump 記憶體洩漏的問題。