C++重載運算符的形式及規則
運算符實際上是一個函數,所以運算符的重載就是函數的重載。
1、那麼重載運算符是幹什麼用的呢?
C++的數據類型分爲兩種:基本數據類型、構造數據類型。
基本數據類型可以通過運算符直接完成算術運算。
類作爲新構造的數據類型,同樣可以使用直接運算。例如:
#include<iostream>
using namespace std;
class C{
public:
int x;
C(int i){
x=i;
}
};
int main(){
C p1(2);C p2(3);
cout<<p1.x+p2.x<<endl;
return 0;
}
程序可以正確輸出結果5,但是使用運算符直接求和形式單一、不利於複製,如果要實現多個對象的累加其代碼的可讀性會大大降低。
使用重載運算符方法就可以解決這些問題。
2、重載運算符的聲明形式如下:
operator 類型名();
operator是需要重載的運算符,整個語句沒有返回類型,因爲類型名就代表了它的返回類型。重載運算符將對象轉換成類型名規定的類型,轉換時的形式就像強制轉換一樣,但如果沒有重載運算符定義,直接用強制轉換編譯器將無法通過編譯。
重載運算符不可以是新創建的運算符,只能說C++語言中已有的運算符。
可以重載的運算符如下:
算術運算符: + 、 - 、 * 、 / 、 % 、++ 、 – 。
位操作運算符:& 、| 、~ 、 ^ 、 >> 、 << 。
邏輯運算符: ! 、&& 、 || 。
比較運算符:< 、 > 、 >= 、 <= 、== 、!= 。
賦值運算符:= 、+= 、-= 、* = 、 /= 、 %= 、 &= 、 |=、 ^= 、 <<= 、>>= 。
其他運算符:[] 、()、 ->、 逗號、 new 、delete、 new[] 、delete[]、 ->* 。
並不是所有的C++語言中已有的運算符都可以重載。
不允許的運算符有:. 、::、 ?、 :: 。
重載運算符時不能改變運算符操作數的個數,不能改變運算符原有的優先級,不能改變運算符原有的結合性,不能改變運算符原有的語法結構,即單目運算符只能重載爲單目運算符,雙目運算符只能重載爲雙目運算符。重載運算符含義必須清楚,不能有二義性。
3、以加法重載函數爲例:
#include<iostream>
using namespace std;
class C{
public:
int x;
C(int i){
x=i;
}
C operator+(C p){
return C(x+p.x);
}
void show(){
cout<<x<<endl;
}
};
int main(){
C p1(2);p1.show();
C p2(3);p2.show();
C p3(0);p3=p1+p2;p3.show();
return 0;
}
關鍵點在於
通過p3=p1+p2調用了
C operator+(C p){
return C(x+p.x);
}
該函數返回值的是一個帶參數的類的對象。這個結果值是以p1爲主體,以p1.x爲基數,把p2當作要加上的類,加上p2.x,最終將p(5)返回到p3上,實現了構造數據類型的重載加法。
類C重載了求和運算符後,由它聲明的兩個對象C1、C2可以像兩個整型變量一樣相加。
結果圖:
4、重載運算符後可以完成對象和對象之間的運算,同樣也可以通過重載運算實現對象和普通類型數據的運算。
#include<iostream>
using namespace std;
class C{
public:
int x;
C(int i){
x=i;
}
C operator+(int y){
return C(x+y);
}
void show(){
cout<<x<<endl;
}
};
int main(){
C p1(2);p1.show();
C p2(0);p2=p1+10;p2.show();
return 0;
}
結果圖: