簡體   English   中英

C ++重寫邏輯失敗

[英]C++ Overriding logical fail

嘿家伙我的一個方法有問題(覆蓋一個操作符,〜)當我嘗試打印我的對象時,出現了意想不到的事情......需要一些幫助

這是我的整個代碼

#include"stdafx.h"
#include<iostream>
using namespace std;

class complex
{
private:
    double Re, Im; 
public:    
    complex(double _Re = 0, double _Im = 0) : Re(_Re), Im(_Im){} //class constructor  

    void print() const
    {
        cout << Re << " + " << "i(" << Im << ")" << endl;
    }
    complex operator~() const
    {
        return (Re, -Im);
    }
}; 

void main()
{
    complex x(2, 3);
    x.print();
    (~x).print();
}

如果我編譯它,我將在屏幕上獲得正確的復數,但當我嘗試執行〜重寫的運算符時,它顯示給我 - -3 + 0 i ....真的需要一些幫助。 謝謝

很抱歉發布了這樣的腦力問題,但我自己無法弄明白......一直看着該死的代碼超過30分鍾,我看不出我錯在哪里。

你錯過了一個complex(Re, -Im); 在:

complex operator~() const
{
    return (Re, -Im);
}

因此,您返回隱式轉換的complex(-Im) (逗號運算符)。 您可以使用顯式構造函數來避免像這樣的陷阱。

逗號

return (Re, -Im);

不做你認為它做的事。

括號內的某些內容不會調用構造函數。 括號被丟棄,表達式被評估為

return Re, -Im;

逗號表示每個術語的評價,結果是最右邊的術語。 因為表達式Re不執行任何操作,所以表達式被計算為

return -Im;

但是這會調用默認值為0的構造函數。 因此,實際部分為-3,想象部分為0。

而應該讀取該行

return complex(Re, -Im);

這構建了你認為應該的東西。

    return (Re, -Im);

這是使用逗號運算符,它評估Re (數字不執行任何操作),然后計算並“返回” -Im (-3)。 然后,返回類型應該是complex ,因此它嘗試將此-3轉換為complex 它找到了這個構造函數: complex(double _Re = 0, double _Im = 0) ,並使用它: complex(-3, 0) complex(double _Re = 0, double _Im = 0) complex(-3, 0) ;

直接的解決方案是在返回時添加單詞complex

    return complex(Re, -Im);

或者,在C ++ 11中,使用{}告訴編譯器您打算調用構造函數:

    return {Re, -Im};

由於您接受構造函數( 0 )的默認值,編譯器將使用以下表達式: return (Re, -Im); 評估Re (它是2)拋出並通過調用構造函數創建一個帶有-Im的新complex ,如: complex(-3, 0) -Im complex(-3, 0) 所以這就是你如何獲得有趣的價值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM