: 今天下午,經過了郝柏翔以及陳韋翰的一起討論,我們發現了驚人的事實:
:
: 請先看看以下的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)