Re: [討論] struct的成員函式

看板C_and_CPP作者 (好人超)時間13年前 (2011/11/11 16:05), 編輯推噓4(4039)
留言43則, 8人參與, 最新討論串2/2 (看更多)
※ 引述《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

11/12 00:10, , 1F
被你這樣一講,感覺我自己有部分矛盾- -
11/12 00:10, 1F

11/12 00:11, , 2F
像我IO就會用scanf/printf,array還是用C的方法寫
11/12 00:11, 2F

11/12 00:12, , 3F
畢竟cout的效率不好,vector不見得比array快
11/12 00:12, 3F
我一直覺得 printf("", ...); 那裡要自己填 type 這件事很麻煩...XD 而vector光是一個push_back就讓我愛不釋手了,array的size也是個大麻煩 (這樣看起來我用cout跟vector好像只是想偷懶....)

11/12 00:13, , 4F
但傳變數還是會用reference,不用複製感覺就比較有效率
11/12 00:13, 4F
據說 reference 的底層實作還是跟 pointer 是一樣的 (?) 我很怕那種 void foo(int a, int &b) 這類的程式 在函式裡如果寫 { a = 10; b = 20; } 看不出 a 不會影響外部值,而 b 會影響 如果是 void foo(int a, int *b) 的話 寫成 { a = 10; *b = 20; } 就會很明顯

11/12 00:17, , 5F
喔?! reference不是直接把變數給它用,而pointer是再分配
11/12 00:17, 5F
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

11/12 00:17, , 6F
給指標一個記憶體再指向原始變數?(thinking)
11/12 00:17, 6F

11/12 00:20, , 7F
原來還有這個優點!!
11/12 00:20, 7F

11/12 00:22, , 8F
reference更像是T * const 對compiler來說更好做optimize
11/12 00:22, 8F

11/12 00:23, , 9F
有的人習慣 define IN OUT 來標示輸入輸出, 不過今天
11/12 00:23, 9F

11/12 00:23, , 10F
才被微軟陰
11/12 00:23, 10F
被陰是什麼意思呢?這裡我不太懂 我只知道 windows api 裡函式宣告喜歡使用 IN OUT,其實還挺清楚的 特別是 api 裡很多 void foo(......, OUT PVOID reult) 這種東西 有那個 OUT 可以知道那個參數是拿來擺結果的

11/12 00:24, , 11F
vector和c-style array比不合適 要也跟C++0x或boost array
11/12 00:24, 11F
我和 C++0x 跟 boost 都不太熟...XD ※ 編輯: james732 來自: 114.35.184.77 (11/12 00:30)

11/12 00:33, , 12F
VC會偷偷引入那些巨集, 給出不明確的錯誤訊息找錯找半
11/12 00:33, 12F

11/12 00:33, , 13F
11/12 00:33, 13F

11/12 00:33, , 14F
C++0x 已經是C++11了阿XD
11/12 00:33, 14F

11/12 02:05, , 15F
那個可以方便快速完成我的需求就用那個瞜~
11/12 02:05, 15F

11/12 02:05, , 16F
個人是覺得OUTPUT一般都不是成是重點<
11/12 02:05, 16F

11/12 02:06, , 17F
平常就用COUT方便好用,需要特殊輸出就用PRINTF
11/12 02:06, 17F
確實output不是重點了,特別是 console 程式的 output XD

11/12 02:16, , 18F
個人認為reference的好處在於無法傳null,但pointer可以
11/12 02:16, 18F
有的時候反而覺得是缺點耶 XD ※ 編輯: james732 來自: 114.35.184.77 (11/12 10:02)

11/12 16:17, , 19F
自由度比較沒這麼高,但是安全性高滿多
11/12 16:17, 19F

11/12 21:03, , 20F
reference好處在幾個地方,一.好操作.二.用在捕捉
11/12 21:03, 20F

11/12 21:04, , 21F
exceptions. 而且reference用在函式參數上好操作
11/12 21:04, 21F

11/12 21:05, , 22F
原來如此,因為我幾乎不會用C++的exception,所以不懂
11/12 21:05, 22F

11/12 21:06, , 23F
不用搞混*是提取或乘法. 但是一個例外是有傳遞有null
11/12 21:06, 23F

11/12 21:06, , 24F
就算不高興還是要用pointer. 而且當使用array時.
11/12 21:06, 24F

11/12 21:07, , 25F
reference可以得到array真正大小.而非pointer的大小
11/12 21:07, 25F

11/12 21:08, , 26F
我真的覺得reference不能傳null是一件很討厭的事...XD
11/12 21:08, 26F

11/12 21:08, , 27F
我又不喜歡程式裡偶爾用pointer,偶爾用reference
11/12 21:08, 27F

11/12 21:10, , 28F
james732 所以auto_ptr和stl某部份就是在解決這個
11/12 21:10, 28F

11/12 21:11, , 29F
auto_ptr也有屬於它的麻煩…C++似乎還不可能脫離pointer
11/12 21:11, 29F

11/12 21:13, , 30F
stringstream對我麻煩點是,很少書講解清楚這功用
11/12 21:13, 30F

11/12 21:14, , 31F
james732 我覺得auto_ptr或是boost的ptr系列都是問題
11/12 21:14, 31F

11/12 21:14, , 32F
回到最原始的問題,c/c++不會自動清理空間.因此之後
11/12 21:14, 32F

11/12 21:15, , 33F
在怎樣創造這些,依舊問題多多.何況auto_ptr幾乎是用在
11/12 21:15, 33F

11/12 21:17, , 34F
class上,我目前的經驗是為了解決例外發生時,可以釋放空
11/12 21:17, 34F

11/12 21:18, , 35F
間.只是不能用在array.實在很討厭.此狀況下.就直接用vec
11/12 21:18, 35F

11/12 21:21, , 36F
至於boost到底要不要學,我的想法是等vc和gcc都支援
11/12 21:21, 36F

11/12 21:22, , 37F
C++0x在去學.不要去寫一個不能跨編譯器的程式比較好
11/12 21:22, 37F

11/12 21:23, , 38F
雖然很多人會覺得這是廢話.但是一個程式要盡量有跨平台
11/12 21:23, 38F

11/12 21:23, , 39F
能力.也是一個好習慣.儘管很多時候是無法做到
11/12 21:23, 39F

11/12 21:31, , 40F
撇開編譯器未支援的boost不看, boost很多東西蠻好用的
11/12 21:31, 40F

11/12 21:32, , 41F
Callback用到實在是會上癮..雖然我不很懂但我會拿來用 XD
11/12 21:32, 41F

11/12 21:34, , 42F
我是沒機會用c++.而且沒有一個網站已經整理boost的使用
11/12 21:34, 42F

11/12 21:35, , 43F
一直不太想玩它.只是我注意到hashmap,這個好東東就是
11/12 21:35, 43F
文章代碼(AID): #1ElKUkxn (C_and_CPP)
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
文章代碼(AID): #1ElKUkxn (C_and_CPP)