1、概述函數
C++預約義的運算符的操做對象只能是基本數據類型,可是實際上許多用戶自定義類型(例如類),也須要相似的運算符操做,C++能夠經過運算符重載來知足這種需求。運算符重載本質就是函數重載,也是C++多態的一種形式。運算符重載是經過建立運算符函數實現的,和其餘函數相似,惟一的區別是函數名爲關鍵字operator和運算符符號組成。this
2、運算符重載限制指針
(1)至少有一個操做數是自定義類型,防止爲基本數據類型重載運算符對象
(2)不能違反運算符原來的句法規則,不能修改運算符優先級變量
(3)不能建立新的運算符數據類型
(4)有些運算符不能重載數據
(5)大多數運算符重載能夠經過成員函數或者非成員函數實現,可是有些運算符只能經過成員函數重載,例如賦值運算符=、函數調用運算符()、下標運算符[]、經過指針訪問類成員運算符->類型轉換
3、友元函數co
在類聲明中,友元函數在聲明前添加friend關鍵字,在函數定義中不用再添加friend關鍵字,也不用添加類的限定符,由於友元函數爲非成員函數,可是友元函數能夠訪問類成員變量錯誤
4、運算符重載的兩種方式
一、運算符重載函數爲類的成員函數
(1)函數定義
<返回值類型> operator <運算符符號>(<形參>)
{
}
(2)函數調用
<對象名>.operator <運算符>(<實參>)
或者<對象名><運算符><參數>
二、運算符重載函數爲類的友元函數
(1)函數定義
friend <返回值類型> operator <運算符符號>(<參數類別>)
{
}
(2)函數調用
operator <運算符>(<參數1>,<參數2>)
或者operator <運算符>(<參數1>,<參數2>)
5、兩種運算符重載形式比較
一、運算符重載函數爲成員函數時,函數的參數要比原來的操做數少一個,由於成員函數用this指針隱式地訪問了類的一個對象,它充當了運算符函數最左邊的操做數
二、運算符重載函數對於成員函數和友元函數這兩種形式只能選擇一種,不然將產生二義性錯誤
三、當須要重載的運算符具備可交換性時,選擇友元函數
四、當運算符左邊的操做數是不一樣類的對象時,例如cout<<MyClass,則必須採用友元函數來實現。
五、賦值運算符=、函數調用運算符()、下標運算符[]、經過指針訪問類成員運算符->,這些運算符只能採用成員函數進行運算符重載
六、 若運算符所需的操做數(尤爲是第一個操做數)但願有隱式類型轉換,則只能選用友元函數