[英]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.