前面我們曾經提過函式的過載
對於過載一詞想必大家不是非常陌生
既然函式都可以過載,那麼運算子當然也是可以過載啦!!!
比如我們日常習慣於的「+」運算子,還有「<<」位移運算子等,舉個例子:
兩整數(int)相加得出相加所得的整數
兩浮點數(float)相加得出相加所得的浮點數
而一整數一浮點數相加得到的還是浮點數
以上的例子都是相加,但相加前後的型別不一樣,系統怎麼分辨出應該輸出什麼型別的結果呢?
所以就需要過載運算子,這些系統都給我們過載好了,當然我們也能過載為其他形式
過載運算子我們需要先定義乙個過載運算子的函式
過載運算子的函式一般格式如下:
函式型別 operator 運算子名稱 (形參表)
對運算子過載的函式有兩種處理方式,可以作為類成員函式或友元函式
讓我們來直接看**
#include using namespace std;
class complex
;complex::complex(double a, double b)
complex complex::operator + (complex &s) //過載函式
int main()
函式的過載看著也不是很複雜,就是用乙個函式過載運算子,並在運算子出現且滿足過載函式的時候,按過載函式內的演算法執行
需要區別的是,實際上運算子過載函式應當有兩個引數,但這裡是作為類成員函式過載的,所以有乙個引數是隱含的,運算子函式是用this指標隱式地訪問類物件的成員
將運算子過載,過載函式可以不作為成員函式,而是放在類外,作為友元函式
#include using namespace std;
class complex
};complex::complex() //要帶上無參建構函式
complex::complex(double a, double b)
complex operator + (complex &s1, complex &s2) //類外的友元過載函式
int main()
作為友元函式有2點要注意的
一是不要忘了友元函式的宣告方法,前面帶friend,類外面定義內容時就不用帶了
二是作為類外函式,不要在加上作用域限制了,不要寫成這樣了
complex complex::operator + (complex &s1, complex &s2)
這兩種辦法均可以過載運算子,但是並不是說對所有情況這兩種方法都適用,所以那些有限制呢,我們後面再講
1.c++不允許使用者自己定義新的運算子,只能對已有的c++運算子進行過載
2.有五個不能過載的運算子:
. (成員訪問運算子)
* (成員指標運算子)
:: (域運算子)
sizeof (長度運算子)
?: (條件運算子)
3.過載不能改變運算子運算物件的個數
如:雙目運算子(雙目運算子就是需要有兩個引數進行運算的運算子)過載後仍為雙目運算子
單目運算子(單目運算子就是只需要乙個個引數進行運算的運算子)過載後仍為單目運算子
4.過載不能改變運算子的優先順序
5.過載不能改變運算子的結合性
如賦值運算子「=」是將右邊的值賦給左邊,不能過載為左邊的值賦給右邊
6.過載運算子的函式不能有預設的引數
有預設引數,個數就不相同了,跟3違背了
7.過載運算子必須和使用者定義的自定義型別的物件一起使用,其引數至少應有乙個類物件(或類物件的引用)
說簡單了就是過載後的運算子所需滿足的條件不能和沒過載時所需滿足條件相同
如過載「+」,改為兩個引數相減
int operator + (int a, int b)
改之前只要兩個是兩個int型就相加,改之後只要是兩個int型就相減
那最後有兩個int型,是相加還是相減呢?
8.用於類物件的運算子一般必須過載,但是有兩個例外,運算子「=」和「&」不必使用者過載
比如,兩物件相加需要過載「+」,但是乙個物件向另乙個物件賦值(當然要同類)時,就不需要再過載「=」
C 運算子過載規則
運算子過載是通過函式過載實現的,下面我們來介紹一下運算子過載需要遵循的規則。1 並不是所有的運算子都可以過載。能夠過載的運算子包括 newnew delete delete 上述運算子中,是下標運算子,是函式呼叫運算子。自增自減運算子的前置和後置形式都可以過載。長度運算子sizeof 條件運算子 成...
C 運算子過載規則
運算子過載時要遵循以下規則 1 除了類屬關係運算子 成員指標運算子 作用域運算子 sizeof運算子和三目運算子 以外,c 中的所有運算子都可以過載。2 過載運算子限制在c 語言中已有的運算子範圍內的允許過載的運算子之中,不能建立新的運算子。3 運算子過載實質上是函式過載,因此編譯程式對運算子過載的...
C 運算子過載的規則
c 對運算子過載定義了如下幾條規則。1 c 不允許使用者自己定義新的運算子,只能對已有的c 運算子進行過載。例如,有人覺得basic中用 作為冪運算子很方便,也想在c 中將 定義為冪運算子,用 3 5 表示3 5,這樣是不行的。2 過載不能改變運算子運算物件 即搡作數 的個數。如關係運算子 和 等是...