2015-10-17 68 views
-4
double& squaredX (double x) 
{ 
    return x*x; 
} 
  1. 這個函數的潛在問題是什麼?
  2. 什麼是重寫函數的最好方法?
+0

你不會說你正在使用什麼語言,這會幫助你很難。無論如何,'&'看起來像是我的錯字。 –

+0

假設這是C++,則返回對臨時對象的引用。 – user3553031

+0

我認爲這可能屬於[代碼評論](http://codereview.stackexchange.com/)。 – Jamesking56

回答

1
  1. 這個函數的潛在問題是什麼?

它不會編譯,因爲你不能綁定一個非const引用到一個臨時的(這是x*x結果,臨時int,而double&返回類型甚至不兼容),這樣即使你正確的是,你正在返回一個不正確的局部變量的引用,因爲當函數返回時該變量超出了範圍。

  1. 什麼是重寫函數的最佳方法?

類型的x*xint,所以是有意義的返回int

int squaredX (int x) 
{ 
    return x*x; 
} 

這有可能是的x*x結果是太大,無法爲int,在這種情況下,你可能希望使用更大的類型來計算和返回值。但這取決於具體的情況。

0

可能更好的一種方法是使用模板和通用轉發引用(C++ 11或更新版本)。

template<typename T> 
T square(const T&& x) 
{ 
    return x*x; 
} 

牛逼可能是doubleint8_tintMyComplexMath::Quaternion ...任何支持operator*。如果參數的拷貝成本很高,它也支持通過引用。

可以說,這可能(正確如此)嚇跑人,所以可能不是「最好的」。它仍然沒有解決溢出問題。

+0

如果您正朝着這個方向努力,那麼您最好提供輸出作爲參考參數,以避免複製返回值,並使用'* =',當與類一起使用時,效率會更高。 –

+0

@NeilKirk - 你的意思是返回一個引用而不是一個值?這通常不被推薦 - 編譯器RVO(返回值優化)應避免返回值的副本。 '* ='是非常量 - 這看起來像是一個交易斷路器。 –

+0

不,我的意思是參考被作爲參數傳遞。 RVO不會改變'x * x'分配臨時對象的事實。如果它是一個類,它可能會分配動態內存。 –