1. 過載操作符1.1 限制過載操作符具有以下限制:
(1) 只有c++預定義的操作符集中的操作符才可以被過載;
(2) 對於內建型別的操作符,它的預定義不能被改變,應不能為內建型別過載操作符,如,不能改變int型的操作符+的含義;
(3) 也不能為內建的資料型別定義其它的操作符;
(4) 只能過載類型別或列舉型別的操作符;
(5) 過載操作符不能改變它們的操作符優先順序;
(6) 過載操作符不能改變運算元的個數;
(7) 除了對( )操作符外,對其他過載操作符提供預設實參都是非法的;
1.2 注意點(1) 後果載操操作符首先要確定它的返回值是左值,還是右值,如果是左值最返回引用,如果是右值那就直接返回值;
(2) +號等這樣的操作符沒有物件可以容納改變後值,對於這樣的情況最好返回數值,否則只能要操作符體內置立臨時物件用於容納改變後的值,如果在堆中建立臨時物件返回指標或者引用,在操作符函式體外還需要釋放它,如果返回的物件而不是引用或者指標,那麼效率是比較低的。如果返回的是數值,最好在該類的建構函式中增加對該型別數值的轉換函式,如:返回值是int型別,那麼最好有乙個int型別作為引數的建構函式。
(3) 在增量運算子中,放上乙個整數形參,就是後增量執行符,它是值返回,對於前增量沒有形參,而且是引用返回,示例:
class test
test &operator ++(); //前增量
test &operator ++(int);//後增量
private:
int m_value:
};test &test::operator ++()
test test::operator ++(int)
(4) 因為強制轉換是針對基本資料型別的,所以對類型別的轉換需自定義;
(5) 轉換執行符過載宣告形式:operator 型別名();它沒有返回型別,因為型別名就代表了它的返回型別,所以返回型別顯得多餘。
(6) 一般來說,轉換運算子與轉換建構函式(即帶乙個引數的建構函式)是互逆的,如有了建構函式test(int),那麼最好有乙個轉換運算子int()。這樣就不必提供物件引數過載運算子了,如test a1(1);test a2(2); test a3; a3 = a1+a2;就不需要過載+號操作符了,因為對於a1+a2的運算,系統可能會先找有沒有定義針對test的+號操作符,如果沒有,它就會找有沒有針對test類轉換函式引數型別的+號操作符(因為可以將+號執行結果的型別通過轉換函式轉換為test物件),因為test類有個int型別的引數,對於int型別有+操作符,所以a1+a2真正執行的是test(int(a1) + int(a2));即test(3);
(7) 對於轉換運算子,還有乙個需要注意的地方就是,如果a類中有以b為引數的轉換函式(建構函式),那b中不能有a的轉換運算子,不然就存在轉換的二義性,如:
class a}; class b};那麼以下語句就會有問題:
b b; a(b);//a(b)有就可能是a的建構函式,也可以是b的轉換運算子
操作符過載
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...
過載操作符
過載操作符是個好青年,但是要吐槽的是 我們時常為了過載操作符編寫許多重複的 這是枯燥的,但是也是必須的。你過載的越多,你的類的彈性就越大。但是,你也不能為所欲為。玩遊戲總是遵守相應的規則,寫過載操作符亦是如此 以下是要遵守的遊戲規則 一元操作符可以是不帶引數的成員函式或帶乙個引數的非成員函式。二元操...