C++ operator overloading

SUM2 = SUM = A+B+C;

請問如果我要寫像上面這樣的overloading要怎麼寫才行呢? (注意:A和B和C的值不可以被更動到)

如果我的加法用下面這種方式,雖然很通用,但是我的回傳值是跟記憶體要的,並且我用完並沒有辦法去做歸還。這樣的寫法Dev Cpp的compiler並沒有任何問題(當然),但是總感覺很奇怪

P.S.這個class是要拿來做大數運算的

BigInt &operator+(BigInt &bInt)

{

BigInt *SUM;

SUM = new BigInt() ;

SUM = *this + bInt; 這一行只是示意而已

return *SUM;

}

不知道這樣說明清不清楚,不清楚的話可以依照題目直接寫你們的做法也OK,為求簡單起見,就當作寫一個自己的"int" Class。

Update:

感謝您認真的回答

不過a + b;雖然可以執行

sum = a + b;卻會出問題

出現以下error

no matching function for call to `BigInt::BigInt(BigInt)'

initializing argument 1 of `BigInt& BigInt::operator=(BigInt)'

Update 2:

當出使用會遺失記憶體的方式也是因為這個原因

還有想要請問,你提供的這個

"所以你的 operator + 應該變成一個 global function:"

"class BigInt"

--省略--

這個真的很棒,以前都沒學過,但是我在寫到"等於"的時候還是會出問題(跟上述一樣)

我想請問有加const和沒加const的差別!! 因為沒加不能用!!

還有Class有用reference和沒用有差很多??

Update 3:

這是程式碼

http://webhd.xuite.net/_oops/k609305200/9ik

稍微說明一下我程式碼內容,這樣比較好理解

class

{

private:

這邊都是運算用的function

public:

資料

解構function

建構function

回傳值function

overloading function

}

中間有參雜一些其他功用的function,有點點亂,請見諒。

Update 4:

哇!!

連k和i都被你看到了

您真用心!!!

小弟感動萬分

感謝

delete [] 的倒是沒注意到......= =|||

c = a;可以

可是

c = a + b;

還是不行,這是為什麼呢???

Update 5:

剛剛測試了一下,我如果是用Visual C++去跑程式compiler會過耶

不像Dev Cpp會跑出那個問題

不過Dev Cpp的這個問題沒辦法解決?? 這因該是某種原因才會造成的問題吧(我不知道為什麼)

Update 6:

還有小弟有個疑惑的地方

有加const和沒加const的差別在哪裡!!

傳參數的時候對這個超敏感的!!! 例如:

BigInt operator+(BigInt const &lhs, BigInt const &rhs)

{

BigInt sum;

sum = lhs + rhs; //這樣子也不能相加!!! 害我要再多用兩個變數。

....省略

}

Update 7:

出現的error訊息是這個,當初會用回傳參考也是因為用參考就不會有這個error。(雖然傳參考會memory leak)

no matching function for call to `BigInt::BigInt(BigInt)'

圖片

http://photo.xuite.net/k609305200/4903630/1.jpg

順帶一提

c = a;

確實可以

c = a + b;才會出現這個error

1 Answer

Rating
  • 其威
    Lv 7
    9 years ago
    Favorite Answer

    照你的寫法會有 memory leak. 舉例來說:

    BigInt w, x, y, z;

    w = x + y + z;

    會先算 tmp1 = x + y, 再算 tmp2 = tmp1 + z, 再設定給 w.

    於是 x + y 與 tmp1 + z 裡面 new 出來的記憶體就永遠拜拜了.

    所以, 「+ - * / & | ^ && ||」這幾個運算子不應該 return reference, 應該直接 return object.

    (事實上你不應該 overload && 與 || 這兩個運算子, 因為你絕對沒辦法達成與內建型別相同的行為.)

    class BigInt

    {

    public:

    BigInt(int n): _number(n) {}

    BigInt operator + (BigInt const & rhs)

    {

    BigInt ret(*this); // copy c-tor

    ret._number += rhs._number; // 這當然也是示意而已.

    return ret;

    }

    private:

    int _number;

    }

    可是這種作法有個問題, 就是你如果有兩個數字要相加, 一個 Int 一個 BigInt, 就一定得先寫 BigInt:

    BigInt y, x(100);

    y = x + 20; // 沒問題

    y = 20 + x; // 失敗!!!

    所以你的 operator + 應該變成一個 global function:

    class BigInt

    {

    friend BigInt operator + (BigInt const &, BigInt const &);

    public:

    BigInt(int n): _number(n) {}

    private:

    int _number;

    };

    BigInt operator +(BigInt const & lhs, BigInt const & rhs)

    {

    return BigInt(lhs._number + rhs._number);

    }

    那麼, 因為 BigInt class 可以接受一個 int 當成 c-tor 引數, 所以以下兩行都可以有正確的行為:

    y = x + 20; // 實際上呼叫 ::operator +(x, BigInt(20))

    y = 20 + x; // 實際上呼叫 ::operator +(BigInt(20), x)

    你不用在意不傳 reference 會呼叫過多次 copy c-tor, 因為現在的 compiler 多半都有 return value optimization 來處理這個問題.

    不過如果是 +=, 倒是可以回傳 const reference.

    在設計 class 的 operator overloading 的時候, 最好將它設計的與 內建型別的行為相似. 例如你可以寫:

    int x = 3, y = 4;

    x += y += 5; // 先做 y += 5 得到 y = 9, 再做 x += y 得到 12.

    所以即使上述 int 換成 BigInt 應該也要可以正常編譯執行.

    如此, operator += 可以這樣設計:

    BigInt

    {

    public:

    /* ... */

    BigInt const & operator += (BigInt const & rhs)

    {

    _number += rhs._number;

    return *this;

    }

    /* ... */

    };

    2011-05-15 23:57:10 補充:

    另外, 你的 operator = 應該 return 一個 T&, 因為在內建型別可以這樣搞:

    int x;

    (x = 3) = 5; // 最後 x = 5;

    class BigInt {

    public:

     BigInt & operator = (BigInt const & rhs)

     {

      _number = rhs._number;

      return *this;

     }

    };

    2011-05-16 20:09:40 補充:

    補充不下了...

    我看了你的程式, 裡面有幾個問題:

    1. 這個很嚴重, 請你一定要把牢記:

    「new 配合 delete, new [] 配合 delete []」

    你 bData 用 new char[SIZE], 可是 delete 的時候卻沒有加上 [].

    這會導致他只還回第一個元素後面的東西就統統 memory leak 了.

    你要檢查程式中所有用到 delete 的地方, 加上 [].

    2011-05-16 20:09:46 補充:

    2. 你的 subBigInt() 的最後一個 for 迴圈, 控制變數用 i, 但是裡面統統用 c[k]. 我猜你是想寫 c[i]

    operator = 倒是沒問題, c = a 這種東西可以正確執行.

    2011-05-16 20:12:08 補充:

    在 *nix 下有 valgrind 可以用來 trace 這種 memory 問題.

    在 windows 下我不知道有沒有什麼好工具, 這是 google 跟我說的, 也許你可以參考看看:

    http://stackoverflow.com/questions/413477/is-there...

    2011-05-16 22:48:18 補充:

    c = a 可以, c = a + b 就可以.

    因為 a + b 回傳一個 BigInt, 理應可以被 operator = 接受.

    請問你在 dev-c++ 遇到的 error 是什麼?

    另外, 在你確信不需要改到該變數的時候, 應該加上 const.

    這可以避免你寫一寫不小心改到傳進來的東西.

    例如 a + b, operator + 不應該修改 a 與 b, 所以把這兩個參數宣告成 BigInt const &, 避免你在函式中不小心修改到 a 或 b 的值.

    2011-05-17 18:04:58 補充:

    這大概是 gcc3 的 bug.

    dev-c++ 使用 gcc 3.4, 很久沒更新了.

Still have questions? Get your answers by asking now.