條款21:必須返回物件時,別忘想返回其
阿新 • • 發佈:2018-12-17
舉世譽之而不加勸,舉世非之而不加沮 雖然值傳遞存在效率等方面的問題,但是不能夠一味地追求引用傳遞從而犯下一個錯誤,:開始傳遞一些引用不存在的物件。 所謂的引用只是個名稱,代表某一個既有的物件。任何時候看見一個引用宣告式,都應該立刻問自己,他的另一個名稱是什麼?因為他一定是某一物的另一個名稱。所以為了返回其引用,必須創造這個物件。 創造物件的方法有以下兩種:
- 在stack空間
- 在heap空間
如果定義一個區域性變數,就是在棧空間建立物件。
//計算兩個分數相乘
const Ration& operator* (const Ration& lhs,const Ration& rhs)
{
Rational result(lhs.n * rhs.n,lns.d * rhs.d);
return result;
}
錯誤1:目標是避免建構函式,但是result卻像任何物件一樣由建構函式構造起來 錯誤2:返回的是引用指向的result,但是,result是一個local物件,在函式退出之前就銷燬了。 堆空間上的寫法也不可行。 一個“必須返回新物件”的函式的正確寫法是:就讓那個函式返回一個新物件唄,以上程式碼可以寫如下:
inline const Ration operator* (const Ration& lhs,const Ration& rhs)
{
return Rational(lhs.n * rhs.n,lns.d * rhs.d);
}
- 請記住
- 絕不要返回pointer或者reference指向一個local stack物件,或者返回reference指向一個heap-allocated物件,或者返回pointer或引用指向一個local static物件而有可能同時需要多個這樣的物件。條款4已經為“在單執行緒環境中合理返回reference指向一個local static物件”提供了一份設計例項。