看板 C_and_CPP 關於我們 聯絡資訊
以下淺見 參考看看 ※ 引述《QQ29 (我愛阿蓉)》之銘言: : 我需要各位高手給我一個觀念上的指點@@ : 以下是我隨興亂測試的code : class A{ : public : : A(){X[0]=2;}char S[4];int X[10]; : }; : class B{ : public : : B(){Y[0]=1;}int S;int Y[10]; : }; : int main() : { : A p; : B *bb = (B*)&p; : //B obj=(B)p; <======1.這行不給過 c-style轉型不是無敵硬轉嘛? : B obj=reinterpret_cast<B &>(p);//改為這樣 B obj = (B)p; 無敵硬轉不成功是因為 B 是user-defined data type 沒定義cast operator() 他不知道怎麼做 從等號分兩邊討論 左邊是copy constructor 問題 右邊是cast operator 問題 1.暫時不考慮shallow cloning/deep clone problem 交給default copy constructor 做 2.稍微顛倒class A/B 位置 並在class A加上cast operator operator B(){return B();} 這樣無敵硬轉應該就會過了... : //2.以下這三個cout為啥 前兩個會一樣第三個不同... : cout<<&(bb->Y[0])<<endl; : cout<<&p.X[0]<<endl; : cout<<&obj.Y[0]<<endl; : return 0; 如果你知道剛剛那是一個copy construction 的動作 那應該就知道第一、二行 和 第三行是兩個不同的instance : } : 如果2.的問題是說 bb指向p 所以起始位址一樣 所以我這樣印結果一樣 : obj自己有自己的位址 所以加個offset所以位址和上面不一樣???? : 3. 如果把三個cout的&拿掉 印值 : 全都印出2............. 這我不懂你要測什麼 :( : 可否請了解運作原理的人 說明一下為什麼嘛... : 我可能可以自己體會為什麼 不過總覺得不要亂認知比較好 最後學的是錯的就不好了... : 所以潑出來請教各位 : 以上1 2 3點問題 請各位解答 謝謝!~ -- 喔 謝懇油錫白德到惡靈來 花縮泡的列為孩兒也的退來累蛤蜊名?胡適播的是 ▄▄翠亨不來十大輸入的噴你耳屎飯 偶爾的覽啪味彎曲的我搜給人特例死稱哩? 安得羅技四銳個劣惡的蹦爸死停因爺兒 給夫普褥輸入的奶店傲夫挖屎屎滴碟兒 ((喔 謝的店屎大屎便夠搬挪也為乎 偶而的練我夫的匪類恩德宏我夫的不累夫?)) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.176.163
QQ29:請問return B();是回傳一個暫時物件嘛? 10/27 13:36
QQ29:另外 我不知道operator這個耶...原來不能有回傳型別.... 10/27 13:40
QQ29:不過@@ B obj=B(p);改為這樣後 obj.Y[0]卻是印出1....怎麼會 10/27 13:43
QQ29:真的搞糊塗了 第三部分就是測試印出來的值 是多少跟轉型之 10/27 13:43
QQ29:間的關係是什麼 ~~觀念模糊 10/27 13:44
QQ29:雖然說改那樣可以過 但是return B();讓我很不解..那本來的p呢 10/27 13:45
POSIX:是暫時的 return by value, 之後做copy 給obj 10/27 13:49
POSIX:是2是1, 是你的constructor設定的呀 -.- 10/27 13:49
QQ29:那p的資訊不就完全的失去了嘛? 是不是我誤會什麼了@@ 10/27 13:51
QQ29:是不是我對轉型的本質涵義根本就誤會了... 10/27 13:54
POSIX:int a = b; 就這樣 -.- b 不會消失 10/27 13:56
QQ29:可是我不是就是希望a要=b嘛 這樣變成根本就只是創一個物件給 10/27 13:58
QQ29:obj~ 那p不就完全沒顧慮他了? 而且為啥用reinterpret結果不同 10/27 13:58
例子弄的太簡潔 可能我誤導你了 我的意思是想讓你知道 cast operator 並不知道有class B 這個type 所以要自己定義 如果怕和reinterpret_cast搞混 那你就把那行替換成 operator B(){return reinterpret_cast<B &>(*this);} 這樣應該就會和直接使用 reinterpret_cast 結果一樣 並且將p的值都copy 過來 你所測試 去掉& 的結果應該也會符合你要的 2 2 2 一個是在外面直接暴力做 一個是在class裡面, 透過data type casting operator來做 ※ 編輯: POSIX 來自: 140.117.176.163 (10/27 14:09)
QQ29:喔原來是*this this就是我這例子的p 我剛剛沒有想到@@ 10/27 14:09
QQ29:那改成這樣可以嘛?operator B(){B *tmp = (B*)this; 10/27 14:14
QQ29:不用到reinterpret 10/27 14:15
POSIX:你在繞圈圈唷..cast operator definition 中用cast operator 10/27 14:18
QQ29:不好意思可否在問一下B *bb = (B*)&p;的話 10/27 14:20
QQ29:(bb->Y[0])印出來的值是多少 這是要怎麼解釋@@ 10/27 14:20
POSIX:將p的位置做起始位置,以B來解釋之 .... 這樣有懂嗎 @@ 10/27 14:33