Re: [問題] 類別型態轉類別型態
※ 引述《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
10/17 00:23, 2F
→
10/17 01:29, , 3F
10/17 01:29, 3F
討論串 (同標題文章)