條款21:必須返回對象時,別妄想返回其reference
遞一些引用或指針指向其實已經不存在的對象。這可不是件好事。
任何時候看到一個reference聲明式,你都應該立刻問自己,它的另一個名稱是什麼?
函數創建新對象的途徑有二:在棧空間和堆空間
棧上:即在函數內的局部變量。局部變量在函數返回後就沒有存在的意義,若還對它“念念不忘”,將帶來災難性
後果。所以傳引用在棧上不可行。
堆上:在堆上構造一個對象,並返回。看似可行,也埋下了資源洩漏的危險。誰該對這對象實施delete呢?別把這
種對資源的管理寄托完全寄托於用戶。所以傳引用在堆上不可行。
可能還有一種想法:把“讓返回的引用指向一個被定義於函數內部的靜態對象”。出於我們對多線程安全性的疑
慮,以及當線程中兩個函數對單份對象的處理也可能帶來不可測行為。所以靜態對象也是不可行的。
一個“必須返回新對象”的函數的正確寫法是:就讓那個函數返回一個新對象。
編譯器實現者實行最優化,用以改善產出碼的效率卻不改變其觀察的行為。所以我們還是老老實實的返回一個對
象吧。
請記住: