Re: [問題] 類別型態轉類別型態

看板C_and_CPP作者 (-858993460)時間14年前 (2011/10/17 00:14), 編輯推噓0(003)
留言3則, 3人參與, 最新討論串2/2 (看更多)
※ 引述《kswiss11 (kswiss)》之銘言: : 開發平台(Platform): VC++ : 問題(Question): : 請問前輩們 : 1. : 我把程式碼一的第14行宣告與31行~39行模仿與 : 程式碼二的第23行宣告與27行~33行 : 發覺程式碼一會compiler錯誤,請問有甚麼原因嗎??? 這是回傳型態問題 #39 你將一個 Cartesian 物件回傳 但函式宣告你回傳 Polar 所以它會去找 Cartesian→Polar 的轉換 可是找不到 所以就出現錯誤了 (其實 codepad 給的錯誤訊息就指出這件事了...) 不過問題在於你這個回傳值是錯的 下面連著下兩題的回答我會說一下怎麼來寫 operator = : 2. : 我將成式碼一把Polar operator = (Polar p);改寫成Cartesian operator = (Polar p);並寫在Cartesian類別中, : 並把31~39行改成以下這樣: : Cartesian Cartesian::operator = (Polar p) //定義多載 = 號函數 : { : double r = p.getr(); : double a = p.geta(); : x = r * cos(a); : y = r * sin(a); : return Cartesian(x, y); : } : 我的問題是x,y的值都已經由 r * cos(a);與r * sin(a);傳入變數x,y了 : 為什麼還需要多這行return Cartesianian(x, y);然後透過Cartesian(double a, double b) {x = a; y = b;}來設定Cartesian類別的資料成員x,y??? : 這樣有點多此一舉不是嗎??? : 3.x,y的值都已經由 r * cos(a);與r * sin(a);傳入變數x,y了 : return Cartesian(x, y);為什麼不可改寫成 return 0;???? : 程式碼(Code): : 程式碼一. : http://codepad.org/WY7RAvrl : 程式碼二. : http://codepad.org/62Fxm3X4 operator = 和程式碼二裡的 operator Cartesian 是不一樣的東西 語意上前面的是指定 後面的是轉型 指定是說我要把參數的內容複製到我自己身上來 轉型是說我要把參數內容變成另一個型態 那所以在轉型的程式碼裡出現 return Cartesian(x,y); 一點都不奇怪 因為它正需要建立一個新物件 但 operator = 不需要這個東西 因為它是要把東西寫進自己身上 那它的回傳值又是什麼? 這是在讓我們能夠寫 a = b = c; 所需要的回傳值 當你寫 a = b = c; 時 實際上會先執行 b = c 得到一個回傳值 假設叫它 t 再來再做 a = t 那麼這個回傳值要是什麼呢? 在內建型態時這個回傳值會是 = 左邊的型態 (其實這是因為 = 會幫你把右邊轉型成左邊再指定過去) 當自訂型別也要有這個特性時 最簡單的回傳值就是自己 所以這時通常會 return *this; 但是如果為了這個回傳還要再做一次複製就浪費大了 所以通常 operator = 會宣告回傳這個 class 的參照 (這也是推文想告訴你的事) 這之間的差別可以看這個範例: http://codepad.org/glJMCGa7 當中 class B 和 class C 的差別僅在於 operator = 回傳是否為參照 你可以看到執行結果裡 class C 多了一次複製 最後也有兩個 class C 的實體被解構 這就是回傳值和回傳參照的差別 這樣你應該知道要怎麼改你的程式了... -- 有人喜歡邊玩遊戲上逼; 也有人喜歡邊聽歌打字。 但是,我有個請求, 選字的時候請專心好嗎? -- 改編自「古 火田 任三郎」之開場白 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.24.87

10/17 00:17, , 1F
古畑任三郎
10/17 00:17, 1F

10/17 00:23, , 2F
這簽名檔是好久以前做的了 顧慮到有人不是UAO環境才這樣寫XD
10/17 00:23, 2F

10/17 01:29, , 3F
老虎知識也有人提出相同的問題耶~( ̄ー ̄;)
10/17 01:29, 3F
文章代碼(AID): #1EcmBipK (C_and_CPP)
文章代碼(AID): #1EcmBipK (C_and_CPP)