精華區beta C_and_CPP 關於我們 聯絡資訊
想問一下,如果重載->的話,那是要怎麼用啊? 我看一個原碼是寫 std::auto_ptr<T> m_pImpl; T* operator->() { return m_pImpl.get() ; } const T* operator->() const { return m_pImpl.get(); } 但是不知道啥時才會進入->裡面... 謝謝~ --
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:http://nopaste.csie.org/27a07 06/14 16:51
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:http://nopaste.csie.org/27a07 06/14 16:51
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