[問題] C++ 多載的涵義

看板C_and_CPP作者 (于)時間12年前 (2013/05/20 23:33), 編輯推噓7(7022)
留言29則, 13人參與, 最新討論串1/1
各位前輩好 我要問的是觀念 所以文章的預設內容我就不填了 小弟我搞不太懂多載的定義 (大概知道他的精神) 可是細部內容不是很懂 目前的觀念是 具備以下兩種條件就可以使用相同函式名稱進行多載 1. 不同的引數個數 EX : int fun(int,int) & int fun(int,int,int) 2. 不同的引數資料型別 EX : void fun(int,float) & void fun(float,float) & void fun(float,int) 而我的疑問在於回傳值的部分有影響嗎 ? 第一種情形 : 一樣的函數回傳值 , 相同的引數資料型態與不同的引數個數 (是多載) 第二種情形 : 一樣的函數回傳值 , 不同的引數資料型態與相同的引數個數 (是多載) 第三種情形 : 一樣的函數回傳值 , 不同的引數資料型態與不同的引數個數 (是多載) 第四種情形 : 不同的函式回傳值 , 相同的引數資料型態與相同的引數個數 ??? 第五種情形 : 不同的函式回傳值 , 不同的引數資料型態與相同的引數個數 ??? 第六種情形 : 不同的函式回傳值 , 相同的引數資料型態與不同的引數個數 ??? 第七種情形 : 全部通通都不同 !!! ??? 搞得我好混亂阿 !!! 比如說 : EX4 : float fun(int,int) & int fun(int,int) EX5 : float fun(int,int) & int fun(float,float) EX6 : float fun(int,int) & int fun(int,int,int) EX7 : float fun(int,float) & int fun(float,int,float) 組合太多種了 @@ 一整個混亂 最後題目來了 : 下列些是多載函式(複選) : (A) int showData() {} (B) String showData() {} (C) int showData(int a) {} (D) int showData(double a,int b) {} (E) void showData(int a) {} (F) double showData(double a,int b) {} 書上沒有答案 ~ 我自己的答案是 : C , D 好煩阿 懇請前輩們解惑 感激不盡 -- █ █ ◢█◣ ██◣ ███ █ █◣ █◣ █◣ ╰══╤══ █ █ █ █ █ █ █ █▄█ █ ◢◤ █ █ █ ███ █ █ █ ◢◤ ◢◤ ◥◣ ═══╪══ ████ █ █ ██◤ ███ █ ██ ██ █◤ ████ █▄█ ◣ █▄ ▄ ▄◤ ( ▲╮ ) ◥▄◤ █▄◤ █▃▃ █ █◤ █◤ ▄◣ ──╯ / > -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 219.70.200.246

05/20 23:38, , 1F
回傳值是不看的 也就是說你的第四種情形會不能編譯
05/20 23:38, 1F

05/20 23:41, , 2F
說不看也不太對...總之只有回傳值不一樣的話不是多載
05/20 23:41, 2F

05/20 23:52, , 3F
一句話: 僅有回傳值不同,參數全相同 是沒辦法通過編譯的
05/20 23:52, 3F

05/20 23:53, , 4F
建議可以自己動手敲一下程式碼
05/20 23:53, 4F

05/21 00:01, , 5F
fun(int) 編譯器會把名稱改成 funci,而 fun(float) 會被
05/21 00:01, 5F

05/21 00:01, , 6F
編譯器改名為 funcf,透過這種藉由 arg list 資訊的名稱
05/21 00:01, 6F

05/21 00:03, , 7F
修飾,來滿足 "名稱不可同名" 這個類似憲法的需求
05/21 00:03, 7F

05/21 00:55, , 8F
從編出來的組語理解
05/21 00:55, 8F

05/21 01:24, , 9F
直接用想的,如果你要寫 compiler,你要怎麼分辨
05/21 01:24, 9F

05/21 01:25, , 10F
回傳值不同的兩個函式
05/21 01:25, 10F

05/21 03:16, , 11F
不能有兩種回傳值
05/21 03:16, 11F

05/21 03:17, , 12F
否則你會有not well-defined 函數
05/21 03:17, 12F

05/21 12:18, , 13F
實作上,重載函式compiler產生的是完全不同的函式名稱
05/21 12:18, 13F

05/21 12:22, , 14F
你可以用IDE去看Gobbledygook,後面會有一些碼
05/21 12:22, 14F

05/21 12:23, , 15F
函式回傳值不同,就像是同名不同型變數宣告失敗的道理
05/21 12:23, 15F

05/21 15:23, , 16F
如果你重載了 int fun() 和 float fun(), 那麼你寫
05/21 15:23, 16F

05/21 15:23, , 17F
"fun();" 時該呼叫哪一個呢?
05/21 15:23, 17F

05/21 15:39, , 18F
好像有點通了 感謝大家
05/21 15:39, 18F

05/21 20:18, , 19F
所以這是C++型別系統先天的限制嗎?
05/21 20:18, 19F

05/21 20:19, , 20F
如果我的回傳值型態是兩種根本不可能互相cast的也是?
05/21 20:19, 20F

05/21 20:26, , 21F
c++只是不想做 而不是不能做
05/21 20:26, 21F

05/21 20:31, , 22F
有個很惡搞的做法 http://ideone.com/TdXR8n
05/21 20:31, 22F

05/21 20:32, , 23F
所以overload resolution的時候判斷回傳值在技術上是
05/21 20:32, 23F

05/21 20:33, , 24F
可行的
05/21 20:33, 24F

05/21 23:02, , 25F
這樣 return type 還是綁死 Foo 吧?
05/21 23:02, 25F

05/21 23:38, , 26F
是啊 所以說是惡搞的做法XD
05/21 23:38, 26F

05/21 23:39, , 27F
只是想說compiler有能力拿等號左邊的東西去決定
05/21 23:39, 27F

05/21 23:39, , 28F
等號右邊要call哪個函數
05/21 23:39, 28F

05/21 23:51, , 29F
這樣看起來轉型還真的很像 function 呼叫XD
05/21 23:51, 29F
文章代碼(AID): #1Hca8nyn (C_and_CPP)