看板 EE_DSnP 關於我們 聯絡資訊
: 今天下午,經過了郝柏翔以及陳韋翰的一起討論,我們發現了驚人的事實: : : 請先看看以下的code: (不要懷疑 它是可以compile的) : : 1 #include <iostream> : 2 using namespace std; : 3 : 4 int main (int argc, char const* argv[]) : 5 { : 6 int y(int a=10); : 7 y(); : 8 int t(); : 9 t(); : 10 return 0; : 11 } : 12 : 13 int t(){ : 14 int y(int a=0); : 15 cout << "In t():"; : 16 y(); : 17 } : 18 : 19 int y(int x){ : 20 cout << "In y():" << x << endl; : 21 } : : 大家請先猜一猜執行結果? : 這種寫法蠻機車的... XD : : : Ans : : In y():10 : In t():In y():0 : : 基本上這個情況大大顛覆了我們(至少是我啦)對function prototype的認知,由測試(nm) : 可以知道,function prototype在編譯之後是不存在的,基本上只是幫助compile認知呼 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 是的, 這點大家要搞清楚有些東西是 for compiler only, 又如 ref var : 叫function是否正確的工具,因此在不同的scope可以有重複的宣告(還可以有不同的 : default value)。(基本上,全域還會屏蔽function內的,要用::y() access) 這個我倒是沒想過, 原來也不知道... 蠻有趣的發現 (筆記ing) : : 這是我對這個問題的認知,如果不對的話請多多指教。 : ※ 編輯: ggegge 來自: 124.11.65.12 (12/23 22:10) : 推 johnathan717:這就是為什麼即使有default value,還是不能宣告 12/23 22:12 : → johnathan717:IntArray a(); 因為這會被當成一個函數的prototype 12/23 22:13 嗯嗯, 這兩個 () 的意義是不一樣的.... IntArray a; // OK! Calling IntArray() IntArray a(); // Becomes function prototype IntArray *a = new IntArray; // OK! Calling IntArray() IntArray *a = new IntArray(); // OK! Calling IntArray() 也許把 2 & 4 搞混了? : → johnathan717:參數是void,return type是IntArray 12/23 22:16 : → johnathan717:晚一點陳韋翰應該會來po華麗版的code 12/23 22:17 : → johnathan717:感謝兩位同學幫我研究了一個下午XD 12/23 22:18 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.224.40.32 ※ 編輯: ric2k1 來自: 61.224.40.32 (12/23 22:55)