一、什麼是操作符過載
1 #include 2
3 using namespace std;
4 5 int main()
6 double get_y()
point(double x = 0.0 , double y = 0.0):x(x),y(y){};
point operator +(point p);
};//過載操作符「+」
point point::operator +(point p)
int main()
;//類外定義格式:
返回型別 operator操作符(參數列)
2.類成員函式實現操作符過載的格式:
class 類名
;//類外定義格式
返回型別 類名::operator 操作符(形參表)
這樣說吧,還是不足以比較這兩種實現方式的區別,我們分別用兩種實現方式寫point類的」+「和」-「的過載。**如下:
#include using std::endl;
using std::cout;
class point
double get_y()
point(double x = 0.0 , double y = 0.0):x(x),y(y){};
friend point operator -(point p1,point p2);
point operator +(point p);
};//過載操作符「-」
point operator -(point p1,point p2)
//過載操作符「+」
point point::operator +(point p)
int main()
{ point p1(1.2,3.2);
point p2(1.1,3.1);
point p3 = p1+p2;
point p4 = operator-(p1,p2);
cout<
這裡不知道大家看到沒有,利用友元函式過載二元操作符」-「時,形式引數是兩個,而利用類成員函式時,形式引數卻只有乙個。這時因為類成員函式中存在this指標,這相當於乙個引數,所以類成員實現操作符過載需要的形式引數比原來少乙個,這比如:利用類成員函式實現一元操作符」-「,就不需要引數了。也正是因為這個原因,友元函式實現的操作符過載是有限制的,比如: ,(),->和 =不能利用友元函式實現運算子的過載。
在實際開發過程中,單目運算子建議過載為成員函式,而雙目運算子建議過載為友元函式。通常下雙目運算子過載為友元函式比重載為成員函式更方便,但是有時雙目運算子必須過載為成員函式,例如賦值運算子=。還有如果需要修改物件內部的狀態,一般可以選擇利用類成員函式進行修改。
三、運算子過載的原則
這樣一看,運算子過載還是蠻簡單的嘛,實際上運算子過載也是要遵循一些原則的:
1.c++中只能對已有的c++運算子進行過載,不允許使用者自己定義新的運算子。
2.c++中絕大部分的運算子可過載,除了成員訪問運算子
.,作用域運算子::,長度運算子sizeof以及條件運算子?:。
3.運算子過載後不能改變運算子的操作物件(運算元)的個數。如:"+"是實現兩個運算元的運算子,過載後仍然為雙目運算子。
4.過載不能改變運算子原有的優先順序和原有的結合性。
6.運算子過載不能全部是c++中預定義的基本資料,這樣做的目的是為了防止使用者修改用於基本型別資料的運算子性質。
操作符過載
ifndef vertex h define vertex h class vertex vertex float px float py float pz vertex operator const vertex p vertex operator const vertex p void oper...
操作符過載
1.操作符是靜態方法,返回值表示操作結果,引數是運算元。2.操作符過載需要在過載的操作符前加上operator關鍵字。3.最好少用操作符過載,只有在意義明晰而且與內建類的操作一致時才適合使用,以免造成混亂。以建立的分數類 fraction 中的 為例,該分數類中有兩個int型的私有屬性 分子 num...
過載操作符
1.過載操作符1.1 限制過載操作符具有以下限制 1 只有c 預定義的操作符集中的操作符才可以被過載 2 對於內建型別的操作符,它的預定義不能被改變,應不能為內建型別過載操作符,如,不能改變int型的操作符 的含義 3 也不能為內建的資料型別定義其它的操作符 4 只能過載類型別或列舉型別的操作符 5...