隱式的this指針運算符函數至少有一個類類型參數重載運算符的優先級應與內置運算符一致::, .*, ., ? : 不可重載
1) 非成員函數的調用 operator+為對象data1, data2的非成員函數
data1 + data2; ==> operator+(data1 , data2);
2) 成員函數的調用 operator+為對象data1的成員函數
data1 + data2 ==> data1.operator+(data2);
重載的運算符本質上就是函數調用.
1) 運算符的求值順序無法保留 如: && , || , & , | 等
2) 無法保留運算符的短路求值屬性
=, [], (), -> 必須為成員復合賦值一般為成員改變對象狀態或與給定對象密切相關的,通常為成員. 如, ++, -- , * 解引用具有對稱性的運算符, 如算術, 相等性, 關系和位, 通常為非成員.
1) 含對象的混合類型表達式,則運算符必須定義成非成員. 2) 當定義為成員函數時, 左側運算對象必須是運算符所屬類的一個對象.
輸入輸出運算符必須是非成員函數,一般為友元.
ostream & operator<<(ostream &os, const Object &item ){ os<< item.data1<< << item.data2; return os; }
第一個參數為非常量ostream引用第二個參數常量引用返回ostream型參進來減少格式化操作,如換行.
istream & operator>>(isteam &is, Object &item){ double p; is >> item.data1>>item.data2>>p; if(is){ item.data2 = item.data2 * p; }else{ item = Object();//輸入失敗:對象被賦予默認狀態 } return is; }第一個參數非常量istream第二個參數非常量對象引用錯誤檢測返回給定流對象引用
常量引用返回一個新對象一般定義對應的復合運算,用它來實現該運算.==和!=一般成對出現
拷貝賦值, 移動賦值,列表賦值,復合賦值
賦值運算符必須為類成員,復合賦值通常也為成員.這兩類都返回左側對象的引用.
必須為成員提供非常量版和常量版
前置和後置成對出現返回對象引用後置版本先記錄對象的狀態,再操作,返回記錄的對象
常量this* 和 ->成對出現*返回& , ->返回指針*先檢測是否在作用范圍箭頭運算符必須返回指針或定義了箭頭運算符的某個對象
class StrPtr { public: std::string& operator*() const { auto p = check(curr, dereference past end); return (*p)[curr]; } std::string* operator->() const{ return &this->operator*(); } //其他內容 }
定義了調用運算符的對象,稱為函數對象可以含有狀態數據
c++中的可調用對象: 函數, 函數指針, lambda表達式, bind創建的對象,重載了函數調用運算符的類.可調用對象也有自己的類型,不同類型可能具有相同的調用形式標准庫function類型--->相同調用形式類型重載函數的名字不能直接存入function類型的對象.解決方法1, 通過函數指針; 2, lambda
必須為成員函數無返回值,無參數通常是const this轉換後的類型與函數返回類型要求相同,即不能是數組或函數類型,但可以是它們的指針是隱式轉換,一般不提供 加explicit變成顯示轉換,注意在以下條件顯示轉換將自動變成隱式轉換 if, while, do的條件部分for的條件部分邏輯非, 或, 與(!, || , &&)條件運算符的條件表達式 例子:IO類istream, ostream
如果我們對同一個類即提供轉換目標是算術類型的類型轉換,也提供了重載的運算符,則將會遇到重載運算符與內置運算符的二義性問題.