看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《kevinptt (囧rz凱子)》之銘言: : 以下我先把我對於struct的認知稍微敘述,如果有誤請指正 :) : struct是在C語言就有的東西 : 而在C之中,並 不允許/沒有 成員函式 的存在 : 所以 : struct test{ : test() { } : }; : 是不行的 : 但是在C++底下 卻會過compiler : 我想問的是 : 在觀念上,應不應該強調要使用成員函式(C++下) : 使用class會比較"正統" : 就像我有一個同學跟我說過 : C++就應該使用<cstdio>而不要用<stdio.h> : 希望各位強大的網友們可以替我解答<(_ _)> 推文不小心離題了,回個文來說說我的想法 我想這並沒有什麼標準的答案 不過我會覺得,當我寫C++的時候,看起來就要像C++ 如果可以寫 cstdio,我就不想寫 stdio.h (不過遇到像 windows.h 這種情況,就會覺得 .h 很刺眼) 如果可以寫 cout,我就不想寫 printf 如果可以用 stringstream,我就不想寫 sprintf (雖然後者常常比較簡潔) 如果可以用 vector,那我就會盡量別用 array 不過我常常不知道要怎麼正確的選擇 pointer 與 reference 才是比較好 所以還是會比較習慣用 pointer,而少用 reference 寫C++的時候,即使class與struct幾乎沒有差別 我還是習慣只當我需要「全部都是public欄位,不擺任何函式」才會用struct 只要有private的需求,或者寫member function的需求 或是繼承、多型的需求,就會用class 就像我寫C#的時候,絕對不會把所有的事情都用 static member function 來寫 看過有些人寫C#或Java,只有一個 class,而且 member function (或稱 method) 全部都寫成 static,然後交給 main 來呼叫,就像寫 C 那樣 這種寫法絕不能說他錯,但就會覺得很怪異... 至於投資什麼程式語言比較好,我覺得要看興趣,以及自己想寫什麼程式 如果你想玩底層,那你說你要學Java就很怪異,學C會比較妥當 如果你說你看到pointer就會想吐,那就學C#或Java或其他更高階的語言 python或perl或ruby也是很好玩的,Javascript學熟後能做的事情也很多 個人想法:如果時間允許的話,我會建議盡量把純C學好,C#或Java挑一個學 至於C++,有愛的話再去鑽研吧 (在這個板講這種話好像很奇怪XD) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.35.184.77
kevinptt:被你這樣一講,感覺我自己有部分矛盾- - 11/12 00:10
kevinptt:像我IO就會用scanf/printf,array還是用C的方法寫 11/12 00:11
kevinptt:畢竟cout的效率不好,vector不見得比array快 11/12 00:12
我一直覺得 printf("", ...); 那裡要自己填 type 這件事很麻煩...XD 而vector光是一個push_back就讓我愛不釋手了,array的size也是個大麻煩 (這樣看起來我用cout跟vector好像只是想偷懶....)
kevinptt:但傳變數還是會用reference,不用複製感覺就比較有效率 11/12 00:13
據說 reference 的底層實作還是跟 pointer 是一樣的 (?) 我很怕那種 void foo(int a, int &b) 這類的程式 在函式裡如果寫 { a = 10; b = 20; } 看不出 a 不會影響外部值,而 b 會影響 如果是 void foo(int a, int *b) 的話 寫成 { a = 10; *b = 20; } 就會很明顯
kevinptt:喔?! reference不是直接把變數給它用,而pointer是再分配 11/12 00:17
void pointer(int *ptr) { *ptr = 10; } pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax movl $10, (%eax) popl %ebp ret void reference(int &ref) { ref = 20; } pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax movl $20, (%eax) popl %ebp ret 在這個情況,兩者的實作幾乎是一樣的 XD
kevinptt:給指標一個記憶體再指向原始變數?(thinking) 11/12 00:17
kevinptt:原來還有這個優點!! 11/12 00:20
hilorrk:reference更像是T * const 對compiler來說更好做optimize 11/12 00:22
loveme00835:有的人習慣 define IN OUT 來標示輸入輸出, 不過今天 11/12 00:23
loveme00835:才被微軟陰 11/12 00:23
被陰是什麼意思呢?這裡我不太懂 我只知道 windows api 裡函式宣告喜歡使用 IN OUT,其實還挺清楚的 特別是 api 裡很多 void foo(......, OUT PVOID reult) 這種東西 有那個 OUT 可以知道那個參數是拿來擺結果的
hilorrk:vector和c-style array比不合適 要也跟C++0x或boost array 11/12 00:24
我和 C++0x 跟 boost 都不太熟...XD ※ 編輯: james732 來自: 114.35.184.77 (11/12 00:30)
loveme00835:VC會偷偷引入那些巨集, 給出不明確的錯誤訊息找錯找半 11/12 00:33
loveme00835:天 11/12 00:33
akasan:C++0x 已經是C++11了阿XD 11/12 00:33
diabloevagto:那個可以方便快速完成我的需求就用那個瞜~ 11/12 02:05
diabloevagto:個人是覺得OUTPUT一般都不是成是重點< 11/12 02:05
diabloevagto:平常就用COUT方便好用,需要特殊輸出就用PRINTF 11/12 02:06
確實output不是重點了,特別是 console 程式的 output XD
mingtai1:個人認為reference的好處在於無法傳null,但pointer可以 11/12 02:16
有的時候反而覺得是缺點耶 XD ※ 編輯: james732 來自: 114.35.184.77 (11/12 10:02)
diabloevagto:自由度比較沒這麼高,但是安全性高滿多 11/12 16:17
angleevil:reference好處在幾個地方,一.好操作.二.用在捕捉 11/12 21:03
angleevil:exceptions. 而且reference用在函式參數上好操作 11/12 21:04
james732:原來如此,因為我幾乎不會用C++的exception,所以不懂 11/12 21:05
angleevil:不用搞混*是提取或乘法. 但是一個例外是有傳遞有null 11/12 21:06
angleevil:就算不高興還是要用pointer. 而且當使用array時. 11/12 21:06
angleevil:reference可以得到array真正大小.而非pointer的大小 11/12 21:07
james732:我真的覺得reference不能傳null是一件很討厭的事...XD 11/12 21:08
james732:我又不喜歡程式裡偶爾用pointer,偶爾用reference 11/12 21:08
angleevil:james732 所以auto_ptr和stl某部份就是在解決這個 11/12 21:10
james732:auto_ptr也有屬於它的麻煩…C++似乎還不可能脫離pointer 11/12 21:11
angleevil:stringstream對我麻煩點是,很少書講解清楚這功用 11/12 21:13
angleevil:james732 我覺得auto_ptr或是boost的ptr系列都是問題 11/12 21:14
angleevil:回到最原始的問題,c/c++不會自動清理空間.因此之後 11/12 21:14
angleevil:在怎樣創造這些,依舊問題多多.何況auto_ptr幾乎是用在 11/12 21:15
angleevil:class上,我目前的經驗是為了解決例外發生時,可以釋放空 11/12 21:17
angleevil:間.只是不能用在array.實在很討厭.此狀況下.就直接用vec 11/12 21:18
angleevil:至於boost到底要不要學,我的想法是等vc和gcc都支援 11/12 21:21
angleevil:C++0x在去學.不要去寫一個不能跨編譯器的程式比較好 11/12 21:22
angleevil:雖然很多人會覺得這是廢話.但是一個程式要盡量有跨平台 11/12 21:23
angleevil:能力.也是一個好習慣.儘管很多時候是無法做到 11/12 21:23
mingtai1:撇開編譯器未支援的boost不看, boost很多東西蠻好用的 11/12 21:31
mingtai1:Callback用到實在是會上癮..雖然我不很懂但我會拿來用 XD 11/12 21:32
angleevil:我是沒機會用c++.而且沒有一個網站已經整理boost的使用 11/12 21:34
angleevil:一直不太想玩它.只是我注意到hashmap,這個好東東就是 11/12 21:35