看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《LPH66 (p2/LPH66歡迎光臨)》之銘言: : ※ 引述《virtu (骨董)》之銘言: : : 請問一下, : : 假設現在有一個物件 : : class Object : : { : : Object &operator=(Object o); : : } : : 然後有另一個物件 : : class funcclass : : { : : Object member; : : Object fun1() : : { : : return member; : : } : : Object & fun2() // 多了個 & : : { : : return member; : : } : : } : : 請問一下, func1 和 func2 有何不同? : : 例如: : : void main() : : { : : funcclass fc; : : Object myobj1, myobj2; : : myobj1 = fc.func1(); : : myobj2 = fc.func2(); : : } : : 其中 myobj1 , myobj2 assign 值的過程如何? : 上面沒有差別 : 它們只有這個時候有差: : fc.func1()=... //compile error : fc.func2()=... //OK : 加了個&的回傳值和不加&的回傳值只差在可以當左值 建議您真的下去編譯看看。其實 Object myobj3; fc.func1() = myobj3; fc.func1() = Object(); 等等寫法,是不會 compile error 滴!也是可以執行滴。 只是這種寫法是在做沒意義的白工。 傳回 Object 會產生暫時物件(程式中 member的複本而不是 member本身)。 它幾乎都會在結束該expression之後消失,所以是做白工(除非又設個 const reference variable 指向它)。 class type 的 non-const temporary object 可以放在等號左邊, 若是 const temporary object 則不行。至於 built-in type 的暫時物件則無論是否 const 都不能做 lvalue. 而傳回 Object& 在上述的例子裡,就是傳回 Object member自身, 當它做 lvalue 時,member 這個 data member 的值就會被更動。 原po的code裡面有不少錯誤,也建議先自行編譯成功再貼上來。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.208.168