1. 基礎概念ios
重載的運算符是具備特殊名字的函數:(重載運算符函數,運算符函數。重載運算符)函數
依次包含返回類型,函數名(operator=),參數列表,函數體。this
只有重載的函數調用運算符operator()纔能有默認實參。spa
關於參數的數量,通常來講,一元運算符有一個參數,二元有兩個,三元有三個;指針
可是若是該運算符函數是成員函數,則其中一個運算對象將是本類對象,第一個參數隱式綁定到this常量指針上,不顯示在參數列表中。成員運算符函數的參數數量比運算符對象少一個。code
HasPtr& operator=(const HasPtr& right){ mString = right.mString; return *this; }
運算符函數要麼是一個類類型的成員函數,要麼它必有類類型的參數。這是由於不能重載內置類型之間的運算(能夠重載類類型與類類型之間的運算,類類型和內置類型之間的運算)。對象
不能本身發明運算符,不能改變運算符的優先級,也不能改變運算符原始運算對象的個數,例如&運算符能夠用於一元運算,也能夠用於二元運算,則根據參數數量判斷是一元仍是二元,可是!操做符永遠不可能重載爲二元運算符。blog
2. 一個例子string
能夠先看一個簡單的例子,重載了類類型Data的 "+" 二元運算符,該運算符函數不是成員函數,所以,參數爲兩個類類型,返回的是類類型中string成員的拼接版(中間加入--)io
#include <iostream> #include <string> using namespace std; class Data{ public: Data(){} Data(string str){ this->str = str; } string str; }; string operator+(const Data& data1, const Data& data2){ string str = data1.str + " -- " + data2.str; return str; } int main(){ Data data1("hello"), data2("slam"), data3("!!!"); cout << data1+data2+data3 << endl; }
輸出:
hello -- slam -- !!!
若但願將操做符函數定義爲Data類的成員函數,則須要改動以下:
#include <iostream> #include <string> using namespace std; class Data{ public: Data(){} Data(string str){ this->str = str; } string str; Data operator+(const Data& data); }; // 只有將返回值定義爲Data類型,表達式才能使用連續運算的形式data1+data2+data3 Data Data::operator+(const Data& data){ str = str + " -- " + data.str; return *this; } int main(){ Data data1("hello"), data2("slam"), data3("!!!"); cout << (data1+data2+data3).str << endl; }
輸出結果相同。
注意在第一個例子中(非成員函數)
data1+data2 等價於 operator+(data1, data2)
第二個例子中(成員函數調用)
data1+data2 等價於 data1.operator+(data2)
3. 經常使用重載運算符
1) 輸入輸出運算符 << >>
2) 算數和關係運算符 == != <
3) 賦值運算符 =
4) 下標運算符 []
5) 遞增和遞減運算符 ++ --
6) 成員訪問運算符 * ->
7) 函數調用運算符 ()