C++重載運算符的形式及規則

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;
} 

結果圖:
通過重載運算實現對象和普通類型數據的運算

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章