看板 C_and_CPP 關於我們 聯絡資訊
遇到的問題: (題意請描述清楚) 我想要印出5 卻印出一個-3346656679 看起來是亂碼 希望得到的正確結果: 5 程式跑出來的錯誤結果: 亂碼 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) Dev-C++, Windows 有問題的code: (請善用置底文標色功能) #include <iostream> using namespace std; class Hello { public: Hello(); ~Hello(); void show(); private: int *firstname; }; Hello::Hello() { int *firstname= new int(5); } Hello::~Hello() { delete firstname; } void Hello::show() { cout<<*firstname; } int main () { Hello a; a.show(); system("PAUSE"); return 0; } 補充說明: 嗚嗚~~為什麼我印不出5??? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.20.136.164
legendmtg:ctor裡面不用int* 寫firstname = new int(5);就好了 06/05 02:12
QQ29:沒new到 你leak了 06/05 02:16
nana0130:謝謝!!可以了@@ 06/05 02:20
nana0130:不過,好怪喔,為什麼又不用加 int * ??? 06/05 02:22
QQ29:你這樣寫 變成local又定義了一個 跟class原本有的不同一個阿 06/05 02:23
QQ29:跑完constructor就leak了 06/05 02:24
legnaleurc:你是在 ctor 裡再宣告一個區域變數遮掉成員變數 06/05 02:24
legnaleurc:我個人只要是成員存取都會用 this-> 來標明 ... 06/05 02:25
legnaleurc:雖然整個 code 看起來很囉嗦 orz 06/05 02:25
james732:不過 this 可以幫助區分區域變數與成員變數 會較易讀 XD 06/05 02:26
nana0130:喔...我懂了~~謝謝Q大 06/05 02:27
nana0130:謝謝大家的指教,我這是故意要用 new poerator 試試看低 06/05 02:32
tinlans:區域變數我是直接在後面補一個底線來命名。 06/05 03:31
loveflames:趁現在問一個問題,在函式裡用extern可以把裡面的local 06/05 03:50
loveflames:(打錯,不是local是參數)或成員變數用global遮掉,可是 06/05 03:51
loveflames:local卻不行,有人知道是為什麼嗎? 06/05 03:52
tinlans:因為 local 是 auto variable,跟 extern 相衝, 06/05 06:55
tinlans:連編都編不過。而且何必自討苦吃,你可以用 ::var 直接 06/05 06:55
tinlans:指定用 global 的,甚至是用 using ::v 這種東西。 06/05 06:56
QQ29:t大每次推文都有看不懂得字眼...t大你有不會的東西嗎... 06/05 10:38
tinlans:我只會 1% 別人不會的東西,別人會的 99% 我都不會。 06/05 11:38
loveflames:那parameter應該算哪種variable?因為它能遮掉 06/05 11:43
tinlans:parameter 算 auto variable。但是它的 scope 跟 local 06/05 11:51
tinlans:有個微妙的差距。因為它算在 function body 的那對大括號 06/05 11:51
tinlans:的 block 之外,所以不會衝突。 06/05 11:51
tinlans:所以一樣的道理,你真的想硬蓋,可以再開一層 block, 06/05 11:54
tinlans:裡面放 extern,這樣那個 block 內就是抓 global。 06/05 11:54
tinlans:你的問題主要是,在同一個 scope 下,對同一個 identifier 06/05 11:56
tinlans:標了不同的 storage class specifier,導致宣告衝突。 06/05 11:57
loveflames:有一點搞不清,parameter能被extern遮,卻不能被local 06/05 11:58
loveflames:遮,compiler會跳出錯誤 06/05 11:59
tinlans:你編不過的問題不叫不能遮掉,叫做宣告衝突,這比判斷 06/05 11:59
tinlans:能不能遮掉更早而且更基本。 06/05 12:00
tinlans:{ auto int v = 10; extern int v; } <-- auto 衝 extern 06/05 12:03
tinlans:parameter 算在 { } 的外面,每開一個 { } 本來就能宣告 06/05 12:05
tinlans:或定義重複的 identifier,所以合法。 06/05 12:05
tinlans:譬如 { int v; while(1) { double v; } } 06/05 12:06
tinlans:所以 { int v; { extern int v; cout << v << endl; } } 06/05 12:07
tinlans:這樣硬開 block 的話,最內層看到的就是 global 了。 06/05 12:07
tinlans:這個差異看早期 K&R C 的 parameter 宣告法會更明顯。 06/05 12:10
tinlans:void foo(v) int v; { extern int v; } 06/05 12:13
loveflames:裡面不另加{},那parameter後面只能宣告不能重新定義? 06/05 12:14
tinlans:「parameter 後面」是指什麼地方? 06/05 12:16
loveflames:另外,while似乎跟for/if/catch有差異,()裡面不能跟{} 06/05 12:17
loveflames:裡有同名的東西,後者則可以 06/05 12:18
tinlans:parameter 先天上就被一個天然的 { } 隔開一層 scope 了。 06/05 12:18
loveflames:函式的{}裡,可以用extern,不能用local 06/05 12:19
tinlans:while/for/if 這些東西的 () 裡面是 C99 特准你定義新的 06/05 12:23
tinlans:變數在運算式上,有效範圍算在 { } 內,那個 () 裡放的 06/05 12:23
tinlans:東西基本上還是叫運算式,跟 function 宣告式 () 裡面放的 06/05 12:24
tinlans:參數列雖然語法很像,卻是完全不同的元素。 06/05 12:24
tinlans:你在同一層 { } 之所以不能又 auto 又 extern,是因為型別 06/05 12:26
tinlans:修飾字衝到。就像你同時寫了 extern int v; 下一行又緊接 06/05 12:27
tinlans:了 extern double v; 這樣。 06/05 12:27
tinlans:這邊遇到的是 int 衝 double,而你前面遇到的是 06/05 12:28
tinlans:auto 衝 extern。 06/05 12:28
loveflames:我沒說那是參數列啊,只是好奇while的性質怎麼跟人不同 06/05 12:28
loveflames:只有它不能在{}用extern或auto宣告同名變數 06/05 12:30
tinlans:雖然我很想直接回說這是規定,但你想理解原因的話也不難。 06/05 12:34
tinlans:假設你寫了 while(int v = 5) { ... }, 06/05 12:35
tinlans:如果允許你在 { } 裡面遮掉 v,你要怎樣修改被遮掉的 v, 06/05 12:36
tinlans:使得 loop 可以結束?雖然你的確能在 { } 內使用 break 06/05 12:36
tinlans:中斷這個 loop,但與其這樣你不如乾脆寫 while(1) 或 06/05 12:37
tinlans:while(true)。 06/05 12:37
tinlans:if() 不是 loop 結構,不能改沒差。for 就算被遮掉, 06/05 12:40
tinlans:還有一個專用的位置可以修改引導 loop 的變數。 06/05 12:40
tinlans:while 就沒有了。 06/05 12:40
tinlans:if 後面我多打了一對 (),無視它就好,慣例上不該這樣寫。 06/05 12:41
loveflames:慣例上不該這樣寫的意思是if()裡不適合定義新變數? 06/05 12:44
tinlans:不,慣例是指討論程式的慣例,寫 xxx() 一般代表 xxx 是 06/05 12:45
tinlans:一個函式,所以我 12:40 第一行第三第四個字母應該去掉。 06/05 12:46
tinlans:應該是第三第四個字元... 06/05 12:46
loveflames:感謝樓上的回答 06/05 13:00
nowar100:推文我認為蠻有價值的,收錄起來~ 06/05 13:45