2012-02-01 55 views
2

爲什麼編譯器不返回錯誤如果operator+()成員函數date類沒有返回任何東西。如果我做運算符+()重載的返回值

date d1,d2; 
date any = d1 + d2; 

然後d1 + d2會創建一個臨時的,這是什麼暫時被初始化所用?

date operator+(date d) 
{ 
    day += d.day; 
    month += d.month; 
    year += d.year; 
} 

注意:它僅用於測試目的。不用於商業用途或任何東西。

+0

我也認爲你需要重新考慮你的實現 - 否則你會得到像第15個月的第60個月的奇怪結果! – 2012-02-01 08:37:16

+1

添加*日期*有什麼意義? – ybungalobill 2012-02-01 08:38:29

回答

4

因爲,它operator +()而不是operator +=(),你應該建立一個臨時的,並返回相同的:

date operator + (const date &d) const 
{   // ^^^^ 1   ^^^^^ 2 
    date temp = *this; // copy current object 
    ... 
    return temp; // important: -Wall warned you for missing 'return' 
} 

還有其他2度重要的變化,你可以看到:

(1)傳遞d作爲const參考;因爲您不需要其他副本

(2)通過在末尾添加const來使operator +正確爲const;因爲你不打算修改this對象

更新:對於你的更新的問題,這裏是一個鏈接,它將回答它。

Why 「not all control paths return a value」 is warning and not an error?

+0

+1用於使用參考常量參數。太多人對非預定義類型使用「堆棧」非引用非指針參數! – vulkanino 2012-02-01 08:27:56

+1

可能值得補充的是,這裏慣用​​的習慣用法是:1)使'operator +'成爲一個自由函數(但除非隱式轉換爲'date',否則這當然不是必須的),2)用'operator + ='。 (你也有幾個'data'的實例,它應該是'date'。) – 2012-02-01 08:36:52

+0

對於具有正確函數原型的示例代碼+1對於operator + – 2012-02-01 08:48:15

2

是什麼日期類的以下重載運算符應返回?我看到它返回垃圾。

你是不是從函數返回任何東西,因此返回的值是任何randowm值,它是一個未定義行爲

你應該明確地使用返回類型Date的對象:

return objName; 
1

你正在修改的+第一個操作數,這是不正確。獲得拷貝並得到返還:

date operator+(date d) const { 
    date r = *this; 
    r.day += d.day; r.month += d.month; r.year += d.year; 
    return r; 
} 
0

date類型的對象。

你應該構造一個新的日期,而不是做各種組件的+=。這是由於您希望+運算符以傳統方式表現爲數字的+運算符。

0

有沒有辦法,但創建一個新的對象返回。 不要擔心複製臨時對象,大多數編譯器會在這裏使用NRVO。