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

作者: VVll (李奧納多皮卡丘)   2016-04-22 00:51:55
※ 引述《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++了
作者: freeunixer (御劍客)   2016-04-22 01:10:00
是 Java/C# 只能 ref 不能 ptr ,就搞不懂 ptr 在幹啥.學 Java/C# 的 ref 以為是 ptr,學過 C++ 才知道並不是
作者: loveflames (咕啾咕啾魔法陣)   2016-04-22 01:22:00
其實C++用smart ptr比較好,還有C++也加入GC機制了
作者: doomleika (iSuck)   2016-04-22 01:38:00
沒有finally強迫要用RAII不然等著resource leak一堆undefined behavior出錯又不會告訴你有問題Double delete把heap搞爛大概一個星期就沒了編譯器對標準不是100%實作有些功能看得到吃不到標準函式庫在應用面太弱變成要實務些東西又要看第三方lib,然後不同lib寫法有不一樣有一堆選擇,也不像一堆語言有規定一個寫法或conventio變成procedure/OO/generic全部都要會不能只會一種,不然沒辦法維護legacy code
作者: loveflames (咕啾咕啾魔法陣)   2016-04-22 01:49:00
C++同樣一件事可以用一堆語法來寫,還有多如牛毛的語法省略規定如果碰到metaprogramming就更可怕
作者: doomleika (iSuck)   2016-04-22 01:50:00
光是i18n預設的compiler搞不好還在用ascii那是要用w_char還是第三方lib的unicode字串?如果有兩個project要整合一個用w_char一個用wxWidget你要怎諸如此類的問題像java現在預設unicode,python有unicode字串或是三版直接預設幫你搞定很多別的語言預設應該弄好的問題到c++就是一堆毛
作者: micola (Logical way)   2016-04-22 08:30:00
delete[] not delete
作者: Kalamu (Kalamu9)   2016-04-22 08:56:00
原PO的寫法用delete沒錯吧!
作者: Rougun (Rougun)   2016-04-22 09:13:00
大家覺得Rust怎麼樣呢
作者: brucetu (sec)   2016-04-22 09:26:00
我覺得this不是指標啊指標抓個CE找個單機遊戲玩玩就懂了也不是什麼門牌跟實體的概念..int*跟int都是占用4byte存著值 本質一樣
作者: atst2 (atst2)   2016-04-22 09:47:00
是實作的結果一樣,本質不同,不同硬體,系統對int的長度可不同啊, 現在認為一樣是長久演變來的習慣
作者: brucetu (sec)   2016-04-22 09:50:00
int長度也算在本質的範圍嗎..真心推薦學習上看到很多*就暈的人 去玩一下CheatEngine找過一兩個偏移 就懂指標運做起來是什麼意思 幾層都一樣
作者: yr (Sooner Born Sooner Bred)   2016-04-22 10:37:00
int *ptr 然後 delete a ,編不過吧,然後陣列要 delete []
作者: dreamnook (亞龍)   2016-04-22 10:40:00
http://www.slideshare.net/olvemaudal/deep-c以前我都覺得我只是穿著泳圈在水面上呼吸看完這個後...證明我是對的XD445頁 有空可以看看 可以了解為何c/c++很"深"
作者: elements (Helianthus annuns)   2016-04-22 11:16:00
Rust 很好阿 值得學
作者: ts04953635 (阿G)   2016-04-22 12:47:00
this比較像是class吧,我覺得
作者: fjyang (自由的風)   2016-04-22 12:55:00
用C寫OO是閉門造車的話,Liunx是自找麻煩?
作者: bibo9901 (function(){})()   2016-04-22 13:08:00
linux kernel 沒有太多OO啊, 要看就看gtk+ 那就真的很醜
作者: femlro (母豬教謀神異端審問官1.5)   2016-04-22 13:10:00
樓下c++之神 yoco
作者: iWRZ (NE~_~RO)   2016-04-22 14:05:00
Linux Kernel OO也還好吧.......
作者: sarafciel (Cattuz)   2016-04-22 14:45:00
等記憶體位置可以取負值再來說int跟int*一樣吧XD
作者: wxywxywxy   2016-04-22 15:40:00
C也可以寫出很棒的oo程式 但要花非常多的心力
作者: oread168 (大地的精靈R)   2016-04-22 15:54:00
幫請神
作者: x000032001 (版廢了該走了)   2016-04-22 17:46:00
負值只是一種表示法而已阿..電腦就只有01 哪來正負
作者: cobrasgo (人魚線變成鮪魚線,超帥)   2016-04-22 18:20:00
基本上C和C++是否能拿來類比就很有討論空間了
作者: zebraseven (Die walkuere)   2016-04-22 19:12:00
你 malloc 前是不是忘了 type casting
作者: brucetu (sec)   2016-04-22 21:50:00
同樣4byte你可以取成正值也可以取成負值啊…我的天R 反正難不難 看個人吧糾結在語言規範說很難 我只覺得那叫很雜 沒什麼令人看不懂的東西 就是多而已 包括那445頁的pdf也是 就是規則多很雜而已 要這樣比 那個語言沒有一堆自己的規則呢
作者: doomleika (iSuck)   2016-04-22 22:01:00
懂這些只覺得未來新人進來會很辛苦
作者: GoalBased (Artificail Intelligence)   2016-04-23 01:01:00
C# 語言規格 500頁
作者: iWRZ (NE~_~RO)   2016-04-23 01:24:00
Thinking in Java 整本厚度和重量可以拿來當殺人凶器
作者: kwpn (ITSST)   2016-04-23 06:12:00
3樓搞錯啦,是C++/CLI有加入GC機制,不是C++
作者: remmurds (Stronghold)   2016-04-23 08:49:00
java目前還沒有真正的泛型 java的泛型比較像是語言特色所以在執行階段時會出現大量的type casting 因為在JVM那層通通都被當成object來存.NET記取了java的缺點 在泛型的設計上跟java有很大的不同 執行階段沒有type casting的問題
作者: duckfly (Java ass)   2016-04-23 13:00:00
JAVA泛型會這麼設計是為了相容之前沒泛型只用Object的寫法,有著歷史包袱沒法像C#可以砍掉重練
作者: loveflames (咕啾咕啾魔法陣)   2016-04-23 13:47:00
回kwpn,minimal GC後來沒進入標準?我倒沒注意
作者: kuope (伯伯)   2016-04-23 16:07:00
Thinking in Java這本書有兩種變成兇器的方式一種是直接揮擊被害人的頭部另一種是讓被害人整本嗑完我不知道那一種比較慘…
作者: newstar2007   2016-04-25 01:42:00
c++沒有原生的應用層library 造成後續很多程式整合上極度的麻煩 光是搞字串這東西就花掉一半的開發時間了如果再扯到微軟過去開發又捨棄的東西 根本災難

Links booklink

Contact Us: admin [ a t ] ucptt.com