Re: [問題] 重載運算子

看板C_and_CPP (C/C++)作者 ((short)(-15074))時間16年前 (2009/04/06 22:03), 編輯推噓1(102)
留言3則, 2人參與, 最新討論串2/3 (看更多)
※ 引述《Ygulu (生活以下)》之銘言: : float.h : #ifndef FLOAT_H : #define FLOAT_H : #include <iostream> : using namespace std; : class Float : { : friend void printFloat(Float); : private: : float F; : public: : Float(): F(0) {} : Float(float x): F(x) {} : Float operator+=(Float &FF) : { : F+=FF.F; : return F; : } : operator float() : { : return F; : } : }; : #endif : TestF.cpp : #include "Float.h" : int main() : { : Float F1(1.2), F2(3.9); : cout << F1 << endl; : cout << F2 << endl; : cout << "F1+F2=" << F1+F2 << endl; : cout << "F1*F2=" << F1*F2 << endl; : cout << "F1+=F1 " << (F1+=F1) << endl; : system("pause"); : } : 這個程式執行起來沒問題 : 但我有兩個問題 : 1. 我沒有定義 operator+() 跟 operator*() 卻可以使用 F1+F2 跟 F1*F2 : 這樣是正常的嗎? 因為你提供了 Float -> float 的方法 (Float::operator float()) 所以當 compiler 看到 operator + (Float, Float) 的"呼叫"時 首先去找 Float::operator + 發現沒有 再來找轉型 然後發現了 Float::operator float() 所以把第一個東西用它轉成 float 再來這樣要把第二個東西也變成 float 剛好也是用這個 operator 來轉 所以總的來說就是變成了 ((float)F1)+((float)F2) 乘的情形類似 : 2. 一定要定義轉換運算子operator float()才能使用重載運算子嗎? : 還是有其他不需要使用operator float()就可以使用重載運算子的方法? 如上, 所以你如果沒提供 operator float() 的話 就要自己定義 Float::operator + (Float) 和 Float::operator * (Float) 這樣 compiler 看到有 operator + 時就會去呼叫了 順帶一提, 這裡你的東西可以順利 cout 的原因也是因為你有 operator float() 因為 <iostream> 裡只有定義 ostream& operator << (ostream &, float f) 這個東西 (cout 可以當做它的第一個參數丟進去) 所以 compiler 看到這裡可以轉成 float 而且剛好合用 就幫你轉了 可以試驗一下: 如果把 operator float() 拿掉的話 compile 時在 cout << F1 這裡就會告訴你找不到適合的函式呼叫 : 感謝您的解答 -- 実琴:「河野!你真的就這樣被物質慾望給吸引過去了嗎?!」 亨:「只要穿著女裝擺出親切的樣子,所有必要花費就能全免,似乎一點都不壞啊。」 実琴:「難道你沒有男人的尊嚴了嗎?!」 亨:(斷然道)「沒有。在節衣縮食生活吃緊學生面前,沒有那種東西。」 --プリンセス・プリンセス 第二話 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.84

04/07 01:45, , 1F
感謝你的回覆 但是我把operatro float()去掉以後
04/07 01:45, 1F

04/07 01:46, , 2F
自己定義 Float::operator + (Float) 還是編譯不過
04/07 01:46, 2F

04/07 02:00, , 3F
如果你沒定義operator<< 他也不知道要怎麼輸出
04/07 02:00, 3F
文章代碼(AID): #19sWkbiV (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
1
4
完整討論串 (本文為第 2 之 3 篇):
1
4
文章代碼(AID): #19sWkbiV (C_and_CPP)