先看程式
inline
complex&
_doapl(complex* ths, const
complex& r) //do assignment plus
inline
complex&
complex::operator += (const
complex& r)
使用如下
complex c1(2,1);
complex c2(5);
c2 += c1 ;
上面的形式是操作符過載,那麼c2 += c1是怎麼被編譯器看待的?見下
inline
complex&
complex::operator += (this, const
complex& r)
//c2相當於this,c1相當於r,相當於c2.operator += (c1);
所有的成員函式函式都帶著乙個隱藏的引數this指標。
為什麼過載+=運算子,返回值是complex&而不是void,如對於:c2 += c1 根本不需要知道返回值,但是如果對於:c3 += c2 += c1,這樣的形式如果返回值void就會出錯了,所以這裡的返回值是complex。
先看使用
complex c1(2,1);
complex c2;
c2 = c1 + c2;//兩個複數相加
c2 = c1 + 5;//複數加實數
c2 = 7 + c1;//實數加複數
對於上述就有三種使用+=運算子的方法,因此得寫三個運算子過載函式。(根據使用方法寫函式原型)
inline complex operator + (const
complex& x, const
complex& y)
inline complex operator + (const
complex& x, double y)
inline complex operator + (const
complex& x, const
complex& y)
上訴**是從stl中拿出來的一部分原始碼。
為什麼把+過載函式設定為全域性函式,而不成員函式?若是+過載函式為全域性函式,就沒法考慮實數+複數和複數+實數的情況了,而只能考慮複數加實數的情況。若這樣做如下
inline
complex& complex::operator + (double y);
c1 + 3; //實際上如下:c1.operator+(3),但卻不能實現3.operator+(c1)
complex c1(2,1);
comlex c2;
cout
<< -c1;
cout
<< +c1;
其過載函式如下
inline
complex
operator + (const
complex& x)
inline
complex
operator - (const
complex& x)
正號和加號的過載函式,負號於減號過載函式,怎麼區分呢?靠引數的個數來區分不同的過載函式。
complex c1(2,1);
comlex c2;
cout
<< (c1 == c2);
cout
<< (c1 == 2);
cout
<< (0 == c2);
對應的有三種過載函式:
inline
bool
operator == (const
complex& x, const
complex& y)
inline
bool
operator == (const
complex& x, double y)
inline
bool
operator == (double x, const
complex& y)
complex c1(2,1);
comlex c2;
cout
<< (c1 != c2);
cout
<< (c1 != 2);
cout
<< (0 != c2);
過載函式如下:
inline
bool
operator != (const
complex& x, const
complex& y)
inline
bool
operator != (const
complex& x, double y)
inline
bool
operator != (double x, const
complex& y)
complex c1(2,1)
cout << c1 << conj(c1)
/*1.cout << c1左邊是cout,右邊是c1,因此可以決定《過載函式引數的第乙個引數(左邊)和第二個引數(右邊)的型別
2.先輸出c1,得到得結果還要繼續能夠接受conj(c1)
*/
過載函式如下:
inline complex conj (const
complex& x) // 共軛複數
ostream& operator << (ostream& os, const
complex& x)
/*可以看出cout是個物件,其型別是ostream。*/
但若這樣寫過載函式
void
operator
<< (ostream& os, const
complex& x)
就不能像下面這樣用了
complex c1(2,1)
cout << c1 << conj(c1)
//此句會出錯
操作符的過載一定是作用在左邊運算元的。會把《符號作用在左邊身上。不要把《操作符寫成成員函式,一定要寫成全域性的函式。解釋下:
//若把《過載為成員函式,那就得這樣使用,顯然不會這樣使用
complex& complex:: operator
<< (ostream& os)
c1 << cout;
操作符過載(三)
目錄前面兩次筆記都是c 中可以過載且無 的操作符,本次筆記比較特殊,主要列出兩個c 語法允許過載 但在工程中不應該 不允許 過載的操作符 這兩個操作符在工程中不允許過載的原因是 過載後無法完全實現操作符的原生語義。先來回憶一下邏輯操作符的原生語義 c 語法是允許過載邏輯操作符的,看下面的示例 inc...
C 操作符過載
1.作為成員過載 class myclass public myclass operator const myclass d cons friend myclass operator const myclass a1,const myclass a2 關於返回值型別的討論 呼叫者堆疊裡返回乙個物件效...
C 過載操作符
過載操作符 一 過載操作符的定義 1.過載操作符的結構 返回型別 operator 需要過載的操作符 形參列表 注意 形引數目應和運算元數目相同。2.過載操作符的幾條注意事項 1 過載的操作符名不能通過連線其他合法符號來建立任何新的操作符。如 2 過載操作符必須具備至少乙個類型別或列舉型別的運算元。...