Re: [討論] c++真的很難嗎?

看板Soft_Job作者 (J.)時間8年前 (2016/04/22 00:52), 8年前編輯推噓23(23053)
留言76則, 28人參與, 最新討論串3/5 (看更多)
※ 引述《joeywayi (拉拉拉吃屎啦)》之銘言: : 如題 : 想請問各位攻城濕 : 因為我自己是學習c++入門的 : 覺得比起java友善很多 : 常常聽到說c++很難 : 這個是真的嗎? C跟C++是完全不同的語言(無誤 C++是個很大很大的坑(相比JAVA/.NET) C的聖經 The C Programming Language 很薄一本 看完也懂了八九成,寫純C你不用看太多書 C++公認的聖經 C++ Primer 厚厚一本 看完之後你更不懂了,寫C++書看不完 C跟C++最簡單的差異包含 1.記憶體管理 //這是C的寫法 int *ptr = malloc(sizeof(int)); //配置記憶體 free(ptr);//釋放記憶體 //這是C++的寫法 int *ptr = new int(100);//配置記憶體 delete a;//釋放記憶體 而C++的new 跟delete又會影響 建構式(constructor)跟解構式(destructor)的呼叫 在C/C++中記憶體管理,是很重要的事情,沒弄好就會造成記憶體被佔用 2. 物件導向(Object-oriented) 把所有方法、函式都模組化,並且有封裝、繼承、多型、抽象的概念(詳細自己研讀) 而舉例來說goto 是C中一個很強大的功能, 但到了C++反而建議不要用,因為會危害程式的可閱讀性 而你要在C中寫出類似OO的語法當然也是可以,但就很像閉門造車,自找麻煩 3. 樣板(Template) C++之所以強大的原因之一,自己研究 然後C/C++ 跟JAVA/.NET 相比 1. 記憶體管理 JAVA/.NET 少了delete 跟free這些要自己手動釋放記憶體的傢伙 取而代之的是Garbage Collection(俗稱GC), 讓底層自動幫你管理哪些資源不再被利用需要釋放 因為是系統底層管理的,所以你也不能知道到底釋放了沒 你頂多使用GC.Collect() //.net 去通知系統該釋放了,但系統到底釋放了沒 天知道 2. 泛型(template) 你沒看錯,跟C++的樣版名稱一樣,但偏偏兩者不完全相同 MSDN中簡單說明了這兩者不是一樣的東西,C#中的是閹割版(應該可以這樣說) https://msdn.microsoft.com/zh-tw/library/c6cyy67b.aspx 3. 指標(pointer, ptr) C就俱備的強大利器,把記憶體的利用又細分成實體跟門牌號碼(指標)的概念 先學JAVA/.Net的在回去看C/C++ 常常會看不懂 ptr到底在幹嘛 因為JAVA/.Net 已經簡化了ptr,在裡面可能會看到的指標大概就只剩this(物件本體) 以上是小弟工作寫了半年C++簡單的介紹.Net 跟C++的差異 如果是學習導向的,C++跟.Net都學不會吃虧 如果是工作導向的,就看你要走哪個領域 e.g 走前端html/javascript的話,你就不需要學C/C++了 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.240.59.148 ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1461257524.A.154.html

04/22 01:10, , 1F
是 Java/C# 只能 ref 不能 ptr ,就搞不懂 ptr 在幹啥.
04/22 01:10, 1F

04/22 01:12, , 2F
學 Java/C# 的 ref 以為是 ptr,學過 C++ 才知道並不是
04/22 01:12, 2F

04/22 01:22, , 3F
其實C++用smart ptr比較好,還有C++也加入GC機制了
04/22 01:22, 3F

04/22 01:38, , 4F
沒有finally強迫要用RAII不然等著resource leak
04/22 01:38, 4F

04/22 01:40, , 5F
一堆undefined behavior出錯又不會告訴你有問題
04/22 01:40, 5F

04/22 01:41, , 6F
Double delete把heap搞爛大概一個星期就沒了
04/22 01:41, 6F

04/22 01:42, , 7F
編譯器對標準不是100%實作有些功能看得到吃不到
04/22 01:42, 7F

04/22 01:45, , 8F
標準函式庫在應用面太弱變成要實務些東西又要看
04/22 01:45, 8F

04/22 01:45, , 9F
第三方lib,然後不同lib寫法有不一樣
04/22 01:45, 9F

04/22 01:47, , 10F
有一堆選擇,也不像一堆語言有規定一個寫法或conventio
04/22 01:47, 10F

04/22 01:48, , 11F
變成procedure/OO/generic全部都要會
04/22 01:48, 11F

04/22 01:49, , 12F
不能只會一種,不然沒辦法維護legacy code
04/22 01:49, 12F

04/22 01:49, , 13F
C++同樣一件事可以用一堆語法來寫,還有多如牛毛的語
04/22 01:49, 13F

04/22 01:49, , 14F
法省略規定
04/22 01:49, 14F

04/22 01:50, , 15F
如果碰到metaprogramming就更可怕
04/22 01:50, 15F

04/22 01:50, , 16F
光是i18n預設的compiler搞不好還在用ascii
04/22 01:50, 16F

04/22 01:52, , 17F
那是要用w_char還是第三方lib的unicode字串?如果有
04/22 01:52, 17F

04/22 01:53, , 18F
兩個project要整合一個用w_char一個用wxWidget你要怎
04/22 01:53, 18F

04/22 01:53, , 19F
諸如此類的問題
04/22 01:53, 19F

04/22 01:54, , 20F
像java現在預設unicode,python有unicode字串或是三版
04/22 01:54, 20F

04/22 01:55, , 21F
直接預設幫你搞定
04/22 01:55, 21F

04/22 01:57, , 22F
很多別的語言預設應該弄好的問題到c++就是一堆毛
04/22 01:57, 22F

04/22 08:30, , 23F
delete[] not delete
04/22 08:30, 23F

04/22 08:56, , 24F
原PO的寫法用delete沒錯吧!
04/22 08:56, 24F

04/22 09:13, , 25F
大家覺得Rust怎麼樣呢
04/22 09:13, 25F

04/22 09:26, , 26F
我覺得this不是指標啊
04/22 09:26, 26F

04/22 09:27, , 27F
指標抓個CE找個單機遊戲玩玩就懂了
04/22 09:27, 27F

04/22 09:27, , 28F
也不是什麼門牌跟實體的概念..
04/22 09:27, 28F

04/22 09:28, , 29F
int*跟int都是占用4byte存著值 本質一樣
04/22 09:28, 29F

04/22 09:47, , 30F
是實作的結果一樣,本質不同,不同硬體,系統對int的長度
04/22 09:47, 30F

04/22 09:48, , 31F
可不同啊, 現在認為一樣是長久演變來的習慣
04/22 09:48, 31F

04/22 09:50, , 32F
int長度也算在本質的範圍嗎..
04/22 09:50, 32F

04/22 09:52, , 33F
真心推薦學習上看到很多*就暈的人 去玩一下CheatEngine
04/22 09:52, 33F

04/22 09:52, , 34F
找過一兩個偏移 就懂指標運做起來是什麼意思 幾層都一樣
04/22 09:52, 34F

04/22 10:37, , 35F
int *ptr 然後 delete a ,編不過吧,然後陣列要 delete []
04/22 10:37, 35F


04/22 10:40, , 37F
以前我都覺得我只是穿著泳圈在水面上呼吸
04/22 10:40, 37F

04/22 10:41, , 38F
看完這個後...證明我是對的XD
04/22 10:41, 38F

04/22 10:42, , 39F
445頁 有空可以看看 可以了解為何c/c++很"深"
04/22 10:42, 39F

04/22 11:16, , 40F
Rust 很好
04/22 11:16, 40F

04/22 11:16, , 41F
阿 值得學
04/22 11:16, 41F
※ 編輯: VVll (211.72.185.162), 04/22/2016 11:42:57

04/22 12:47, , 42F
this比較像是class吧,我覺得
04/22 12:47, 42F

04/22 12:55, , 43F
用C寫OO是閉門造車的話,Liunx是自找麻煩?
04/22 12:55, 43F

04/22 13:08, , 44F
linux kernel 沒有太多OO啊, 要看就看gtk+ 那就真的很醜
04/22 13:08, 44F

04/22 13:10, , 45F
樓下c++之神 yoco
04/22 13:10, 45F

04/22 14:05, , 46F
Linux Kernel OO也還好吧.......
04/22 14:05, 46F

04/22 14:45, , 47F
等記憶體位置可以取負值再來說int跟int*一樣吧XD
04/22 14:45, 47F

04/22 15:40, , 48F
C也可以寫出很棒的oo程式 但要花非常多的心力
04/22 15:40, 48F

04/22 15:54, , 49F
幫請神
04/22 15:54, 49F

04/22 17:46, , 50F
負值只是一種表示法而已阿..電腦就只有01 哪來正負
04/22 17:46, 50F

04/22 18:20, , 51F
基本上C和C++是否能拿來類比就很有討論空間了
04/22 18:20, 51F

04/22 19:12, , 52F
你 malloc 前是不是忘了 type casting
04/22 19:12, 52F

04/22 21:50, , 53F
同樣4byte你可以取成正值也可以取成負值啊…我的天R 反
04/22 21:50, 53F

04/22 21:50, , 54F
正難不難 看個人吧
04/22 21:50, 54F

04/22 21:52, , 55F
糾結在語言規範說很難 我只覺得那叫很雜 沒什麼令人看不
04/22 21:52, 55F

04/22 21:52, , 56F
懂的東西 就是多而已 包括那445頁的pdf也是 就是規則多
04/22 21:52, 56F

04/22 21:52, , 57F
很雜而已 要這樣比 那個語言沒有一堆自己的規則呢
04/22 21:52, 57F

04/22 22:01, , 58F
懂這些只覺得未來新人進來會很辛苦
04/22 22:01, 58F

04/23 01:01, , 59F
C# 語言規格 500頁
04/23 01:01, 59F

04/23 01:24, , 60F
Thinking in Java 整本厚度和重量可以拿來當殺人凶器
04/23 01:24, 60F

04/23 06:12, , 61F
3樓搞錯啦,是C++/CLI有加入GC機制,不是C++
04/23 06:12, 61F

04/23 08:49, , 62F
java目前還沒有真正的泛型 java的泛型比較像是語言特色
04/23 08:49, 62F

04/23 08:50, , 63F
所以在執行階段時會出現大量的type casting 因為在JVM那
04/23 08:50, 63F

04/23 08:50, , 64F
層通通都被當成object來存
04/23 08:50, 64F

04/23 08:51, , 65F
.NET記取了java的缺點 在泛型的設計上跟java有很大的不
04/23 08:51, 65F

04/23 08:51, , 66F
同 執行階段沒有type casting的問題
04/23 08:51, 66F

04/23 13:00, , 67F
JAVA泛型會這麼設計是為了相容之前沒泛型只用Object的寫
04/23 13:00, 67F

04/23 13:00, , 68F
法,有著歷史包袱沒法像C#可以砍掉重練
04/23 13:00, 68F

04/23 13:47, , 69F
回kwpn,minimal GC後來沒進入標準?我倒沒注意
04/23 13:47, 69F

04/23 16:07, , 70F
Thinking in Java這本書有兩種變成兇器的方式
04/23 16:07, 70F

04/23 16:07, , 71F
一種是直接揮擊被害人的頭部
04/23 16:07, 71F

04/23 16:07, , 72F
另一種是讓被害人整本嗑完
04/23 16:07, 72F

04/23 16:07, , 73F
我不知道那一種比較慘…
04/23 16:07, 73F

04/25 01:42, , 74F
c++沒有原生的應用層library 造成後續很多程式整合上
04/25 01:42, 74F

04/25 01:43, , 75F
極度的麻煩 光是搞字串這東西就花掉一半的開發時間了
04/25 01:43, 75F

04/25 01:44, , 76F
如果再扯到微軟過去開發又捨棄的東西 根本災難
04/25 01:44, 76F
文章代碼(AID): #1N6GKq5K (Soft_Job)
文章代碼(AID): #1N6GKq5K (Soft_Job)