Re: [問題] 關於 return reference

看板C_and_CPP作者 (←這人是超級笨蛋)時間10年前 (2014/05/19 20:31), 10年前編輯推噓5(5014)
留言19則, 9人參與, 最新討論串2/3 (看更多)
※ 引述《wowslr (檸檬子)》之銘言:

05/19 12:39,
因為const IDrive& getDrive()回傳const reference
05/19 12:39

05/19 12:41,
但foo(IDrive &drive)想要的是non-const
05/19 12:41

05/19 14:31,
所以這種情況我應該要提供 non-const 和 const 兩個版本?
05/19 14:31

05/19 15:31,
或許 foo 的引數可以設計成 const IDrive &
05/19 15:31

05/19 15:32,
或是IDrive&&
05/19 15:32
這看你究竟想做什麼而定 傳入參考作為引數隱含著函數本身會改變該引數內部值的概念 如果 foo 不會修改傳進去的 drive, 那麼就可以讓它直接接受 const IDrive & 這樣在函數語義上也會比較清晰 反之如果 foo 會修改 drive, 那麼當然你就必須為它提供 non-const 版本的 getter -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 218.161.94.175 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1400502699.A.095.html ※ 編輯: uranusjr (218.161.94.175), 05/19/2014 20:32:17

05/19 22:11, , 1F
啊...原來他是在問這個問題呀 我想得太複雜惹
05/19 22:11, 1F

05/19 22:30, , 2F
我想問一下,一般在設計 getter ,如果沒有特別需要 const
05/19 22:30, 2F

05/19 22:31, , 3F
也都是提供const和non-const兩個版本嗎?或是有其他寫法?
05/19 22:31, 3F

05/20 02:43, , 4F
如果是回傳ref/ptr to member,我都直接提供none-const
05/20 02:43, 4F

05/20 02:44, , 5F
因為傳出去就是為了方便而破壞封裝,有沒有const差不多
05/20 02:44, 5F

05/20 08:15, , 6F
相對的如果是以值回傳的話則通常會掛 const
05/20 08:15, 6F

05/20 08:15, , 7F
(我是指 const member function) 這樣方便使用
05/20 08:15, 7F

05/20 11:27, , 8F
請問一下FOO是啥@@?
05/20 11:27, 8F

05/20 11:33, , 9F
foo是電腦語言界的小明 foo()就是小明函數
05/20 11:33, 9F

05/20 13:36, , 10F
原來有人回了 我會建議提供兩個getter
05/20 13:36, 10F

05/20 13:37, , 11F
這樣要debug會有意想不到的妙用
05/20 13:37, 11F

05/20 14:06, , 12F
以我個人而言, 不是「沒有特別需要 const」就不加, 而是
05/20 14:06, 12F

05/20 14:06, , 13F
相反, 如果可以的話儘量用 const & 或者直接傳值, 除非必
05/20 14:06, 13F

05/20 14:07, , 14F
要才會把 const 拿掉傳 non-const 參考或 pointer
05/20 14:07, 14F

05/20 16:22, , 15F
k大 是指什麼樣的妙用?
05/20 16:22, 15F

05/22 17:26, , 16F
妙用在於你可以在兩個getter各設一個break point
05/22 17:26, 16F

05/22 17:27, , 17F
或者log 可以清楚的知道一些native type call flow是不
05/22 17:27, 17F

05/22 17:28, , 18F
是call到錯誤的 或者用到非預期的member invoke
05/22 17:28, 18F

05/22 17:28, , 19F
這滿難講清楚的 不過碰過一次就知道我意思了 XD
05/22 17:28, 19F
文章代碼(AID): #1JUVch2L (C_and_CPP)
文章代碼(AID): #1JUVch2L (C_and_CPP)