Re: [問題] 重載運算子
看板C_and_CPP (C/C++)作者LPH66 ((short)(-15074))時間16年前 (2009/04/06 22:03)推噓1(1推 0噓 2→)留言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
04/07 01:45, 1F
→
04/07 01:46, , 2F
04/07 01:46, 2F
→
04/07 02:00, , 3F
04/07 02:00, 3F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章