1. 程式人生 > >條款21:必須返回物件時,別忘想返回其

條款21:必須返回物件時,別忘想返回其

舉世譽之而不加勸,舉世非之而不加沮 雖然值傳遞存在效率等方面的問題,但是不能夠一味地追求引用傳遞從而犯下一個錯誤,:開始傳遞一些引用不存在的物件。 所謂的引用只是個名稱,代表某一個既有的物件。任何時候看見一個引用宣告式,都應該立刻問自己,他的另一個名稱是什麼?因為他一定是某一物的另一個名稱。所以為了返回其引用,必須創造這個物件。 創造物件的方法有以下兩種:

  • 在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物件”提供了一份設計例項。