推 ghostl40809:why~07/28 14:36
推 CrazyLord: so~07/28 14:36
→ Nydus: se~07/28 14:37
推 xyz08: ri~07/28 14:39
推 socu: 阿~嘶~07/28 14:41
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 60.249.24.214
→ tinlans:-> 的 overloading 行為跟其它 operator 不太一樣,實質上 06/14 09:13
→ tinlans:比較像是展開。 06/14 09:13
→ ilovebbs:所以使用的時候就像XXX->xxx() xxx會是auto_ptr<T>的函數 06/14 09:38
→ ilovebbs:? 06/14 09:38
→ loveme00835:寫 m_pImpl-> 等於是寫 ( m_pImpl.get() )-> 06/14 09:43
推 loveflames:我也想知道->的重載要怎麼用 06/14 09:44
→ tinlans:對,是 -> 的左邊會先變成 operator-> 的 return value, 06/14 10:32
→ tinlans:然後再做一次 ->。這個效果會連鎖,如果 operator-> 傳回 06/14 10:32
→ tinlans:的物件又有 overload operator->,就會再來一次。 06/14 10:32
→ tinlans:C++ 有一些特殊技巧也是靠這種連鎖展開達成的。 06/14 10:33
→ ilovebbs:喔喔...I see..不過有哪些東西會運用到啊? 06/14 12:17
推 loveflames:operator->裡面除了return,不能做其他事? 06/14 15:36
→ loveflames:(*a)->bbb(); 這行如果把*號拿掉,結果就不是自己要的 06/14 16:53
→ loveflames:可是原文的m_pImpl不也是指標嗎?可以不用加*號? 06/14 16:56
→ ilovebbs:這個...我也不太曉得.囧..還在融會貫通ing 06/14 20:26
推 dustlike:原文的m_pImpl並不是指標。std::auto_ptr確實是物件 06/16 22:57
> -------------------------------------------------------------------------- <
作者: dustlike (灰塵) 看板: C_and_CPP
標題: Re: [問題] 重載-> ?
時間: Wed Jun 16 22:56:24 2010
objX -> _____ ;
這樣的statement會被編譯器視為(當然前提是objX是有重載->運算子的物件)
objX . operator->() -> _____ ;
在這邊請把"operator->"當成純粹的函數名稱,也就是你重載運算子時所用的函數。
推文中tinlans所說的連鎖就是這個意思。
推 loveflames:operator->裡面除了return,不能做其他事? 06/14 15:36
可以啊。operator overloading什麼事情都可以做XD
→ loveflames:(*a)->bbb(); 這行如果把*號拿掉,結果就不是自己要的 06/14 16:53
以下我把->運算子還原成(*).的形式,重載的->運算子用operator->()代替。
其實是這樣的:
(*a)->bbb() ===> (*a) . operator->() -> bbb()
=> (*((*a).b)).bbb()
是用無參數的建構子生成的。
印出13
a->bbb() ===> (*a).bbb()
是有參數為1個int的建構子生成的。
印出11
所以兩者的結果不一樣。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.64.251
推 nowar100:\灰塵耶/ 06/16 23:06