標籤:

學C++是怎樣一種體驗?


第一階段:你學會了 C with Classes,然後把各種東西都包裝成了 class;

第二階段:為了實現多態,你學會了繼承、虛函數、多繼承和虛繼承,然後你用這些技術改寫了一些代碼,實現了代碼重用。你覺得很開心,感覺自己減少了代碼量,提高了工作效率;

第三階段:你學會了用抽象類作為介面,發現以前的繼承關係太複雜,用介面更清晰,於是把代碼都改成了單繼承+介面。你覺得很開心,覺得自己設計了很好的架構;

第四階段:為了實現和使用泛型容器,你學會了模板。你覺得很開心,又進一步提高了代碼重用度;

第五階段:你了解到了動態分派(Dynamic Dispatch)和靜態分派(Static Dispatch),於是你把介面都改成了模板。你覺得很開心,不降低抽象程度卻提高了代碼執行效率;

第六階段:你學會了異常。你有點開始不爽,異常雖方便,但異常安全(exception safety)太難做到了;

第七階段:你學會了移動語義,你覺得很開心,可以用值的形式寫出更高效的代碼;

第八階段:你學會了 unique_ptr,shared_ptr。你覺得很開心,媽媽再也不用擔心我寫出異常不安全的代碼了;

第九階段:你注意到了 Rust 這個語言,然後有意無意地在自己的 C++ 代碼中貫徹 Rust 的思想,比如多用移動語義、trait、const;

第十階段:你學會了模板元編程,SFINAE,並成功地使用不到 30 行代碼使編譯器輸出了 4G 錯誤信息。然後你用模板實現了一套類型安全的 trait 系統。你覺得很開心,編譯器的錯誤提示終於可以看了;

第十一階段:你用 gcc 6 編譯了代碼,然後用你庫的人:what the f*ck??怎麼全是 undefined reference?原來他用的是 gcc 4.8。你不得不用 gcc 4.8 重新編譯。你發現 gcc 4.8 的 libstdc++ 的 ostringstream 沒有實現移動構造函數;

第十二階段:你準備把代碼部署到伺服器上,what the ffffffffffuuuuucccccccc...??!怎麼全是 segfault???!!原來伺服器的系統是 CentOS 6,libstdc++ 版本太低不兼容 C++11……你不得不在伺服器上裝了 gcc 4.8;

第十三階段:你再也不想用 C++ 了。你學會了面向對象的內部實現,用 C 改寫了全部代碼,並實現了一套使用 virtual function 機制的動態分派系統;

第十四階段:你用宏把動態分派全改成了靜態分派,並在 C 里模擬了一套 trait 系統;

第十五階段:你發明了一個編譯到 C 的語言。


C++這門語言比較特殊,是知乎用戶公認人類不能學會和精通的一門語言,如果你學會和精通了,你就不是人(逃

============

基本上的感覺就是覺得任何事情都有辦法繼續調整,會不知不覺地浪費很多時間在細節的糾纏上面,所以現在我都把C++寫成C#了,怎麼方便怎麼來,等真的發現性能不行了,再profile一下重構。反正

  • 重構一次跨幾百個函數,修幾萬個編譯錯誤
  • 能夠把程序寫到重構了就必然有測試用例來提醒你應該改哪裡
  • 能夠把程序寫到重構了就必然有編譯錯誤來提醒你應該改哪裡

是C++程序員必須掌握和習慣的。


學 C++ 的過程對我認識自己是很有啟發的。

高一學完 C 之後就開始學 C++ 了。可惜失敗大概有三四次,混到大一結束也沒學成。這裡面大概有這麼幾個願意:一是智力水平可能沒有完全達到,二是各種教材都故弄玄虛,上來就吹 OO 怎麼讓軟體開發簡單,說來說去就是不告訴 object 就是個 bag,方法調用就是頭一個參數是 this。

到大一升大二的暑假,我基本上在學 3DS Studio,準備放棄學編程了。

大二開學就是軍訓。出發之前我在學校圖書館晃蕩,撿了一本《C++ 深入淺出》。這是本外國人寫的書,原名我也沒記住,現在也找不到了。可惜。

軍訓的時候每天累的賊死。回來就往床上一趟,除了吃飯不動地方。手頭就這一本書。拿起來突然發現全都能讀懂了。不光讀懂,腦子裡還想:以後工作中要是遇到這個問題就可以這麼寫。兩周的軍訓基本上就入門了。

當然學到畢業後第三年才把 template 完全掌握。

能認識自己在很多 C++ 以外地方的東西。不過也可能是學東西趁早的好處。


我個人對C++不好的體驗主要在於:

1. 沒有很好的包管理工具

2. 每個項目用各種不同的構建工具,scons, make, cmake, autoconf...

3. 標準庫的源碼閱讀體驗極差,舉例Java中某個核心庫忘了怎麼用,點進去源碼看到的是一堆注釋和簡潔易懂的參數表,C艹點進去看到的是,allocator, decltype, #ifdefine.....

4. Linux上沒有很好的IDE......


當年為了弄明白C++類定義的最後為啥要加分號研究了很久很久


感覺覺醒了抖m屬性。


我接觸 C++ 有大半年了。個人認為這段時間沒有正式學習,只是

1) 在 cppreference.com 翻譯資料

2) 在知乎力求看懂每個 C++ 相關問題答案和文章

現在自認為沒什麼壓力了,除了仍然覺得 cppreference 上有些關於模板的描述不說人話外……

或許因為我不是 CS 專業且未工作,抑或是因為沒有在正式學習,感覺還算有點愜意。


感覺就是學得越多知道得越少。

剛開始學C++的時候,可以顯示hello world,大作業能簡單寫小程序,感覺自己什麼都會了,簡直so easy。

再後來接觸面向對象,各種繼承封裝。好不容易熬過來了又接觸了模版元編程,函數編程等等,還有C++11之後lambda函數等等新特性大換血...

現在覺得還能寫C++已經是個奇蹟了...


我可能和別人不太一樣,感覺學C++是一種學習曲線平緩,很親民的體驗。

我當年是從什麼二級計算機教材,C primer plus,8086彙編開始學,接觸到的世界一開始就是靜態弱類型值語義的,腦子裡想的都是這有幾個offset的位元組,學C++的OO部分基本上也是沿襲的這一套路子,大部分只是隱式帶一個this指針,外加一個RAII而已。那時候覺得最難的語言是python,因為這貨是引用語義的,那時候我不懂為什麼a=b以後,對a的修改還能被b感知到,覺得這語言機制也是神了,彷彿有上帝的手在操控。

本科期間出於專業課需求,經常要搞圖像處理,矩陣運算,那時候主修的是matlab,python,R,IDL,講究向量化,流水線,以及簡單的函數式編程,滿腦子想的都是演算法會不會太慢,高階函數用指針模擬會不會影響inline效率,這裡有沒有多一個拷貝,那裡是不是應該有個移動語義,矩陣的生命期如何管理,內部採用的應該是不是view/shared_ptr,還讀了一些numpy和opencv的實現,當時覺得C++是世界上最簡單的語言,最難的應該是java,因為我看不懂那些類的名字為什麼要叫Broker/Builder/Factory/Proxy,覺得寫java的人都是一群特別牛逼的架構師。

一直到現在我學很多新知識,感覺腦子裡都經常轉不過彎來,需要腦補翻譯成C++才能讀懂,其實自己都覺得有點還原論了。讀ocaml的代碼,我腦子裡都要先把裡面的subtype用模板重寫一次才知道是什麼意思,看到C#里別人搞個閉包出來,我總是要擔心會不會意外的延長對象的壽命。看到ruby或者lua的代碼,腦子裡可能還要映射成C/C++的對象模型,不然繞不清楚那個方法的查找順序。

所以說這其中大概是有些隔行如隔山的因素。常年做自己領域內的一畝三分地難免產生認知偏差,一些自己覺得理所當然的東西,別人未必覺得是直觀的,反之亦然。

當然,我一直到現在也沒學會java,那玩意的對象模型太複雜了【


有本書叫C++ primer 4th,我看完了。

又有一本書叫 inside c++ object model,我看了前4章。

還有兩本書叫C++ templates和C++ standard library,我都看完了。

期末考試我C++滿分,我還記得最後一道題要寫一個支持泛型的vector,我寫滿了半張卷子,基本實現了一個標準庫中的所有內容,因為我非常熟悉這些代碼,我實現過所有標準容器。

我敢說,在那個時候,計算機系裡沒有人比我更懂C++。

我以為我精通了C++。

然後我在簡歷上面寫上了精通C++,而且面試的時候並沒有被C++相關的問題卡住。

真正讓我考慮暫時放棄C++的,是C++11的出現,我發現新的標準雖然添加了很多語言特性,但和新一代語言相比,缺少必備的特性和庫。比如垃圾收集,異常處理,完整的closure,跨平台線程庫,跨平台網路庫,加密解密演算法庫,正則表達式,包管理......雖然我看了2000多頁C++相關的書籍和材料,花費了很多時間去學習,但是我還要花很多時間去找各種版本的庫,解決跨平台問題,更別提在項目代碼較多時產生的頭文件依賴問題和build速度問題。

較新的語言大部分都有各自的方式解決上述問題,這可以極大地提高一個人的生產效率(more productive),這是C++所不及的。

現在,我的主語言是C#,Go,Typescript,cg。


相當於學了4門語言:

C

OO C++

Template C++

STL


嗯?c++?學C++懂語法只是基本入門,君不見大神們都是人形自走標準+人肉編譯器……江湖人稱自走肉編器!


對我這種智障來說,大概是從入門到入土吧。


從大一開始就學c++,畢業10年了,目前還在學,感覺還是不會


我摸這本書摸了一整天了。我也沒怎麼看進去


大學三年級找實習,簡歷中精通C++。現在的簡歷中,熟練使用C++。


1. 一直覺得要學的東西太多了

2. 感覺一個庫一個風格

3. 再學Python感覺簡潔的多——人生苦短,我倆都用...

...


c艹這語言反人類。

滿懷信心的開始看C++ PRIMER 噁心的很 看了幾百頁後慢慢放棄了,非常建議初學編程的人遠離C艹 這種不直觀 還會打擊普通人學編程信心的語言。

c艹是一門好語言,就像獨孤九劍,不過要練習十年才能神功大成獨步江湖,。


一、加班比別人多,因為C++調試問題很麻煩,出問題了要查很久

二、提高技術太難,感覺永遠朦朦朧朧,C++的特性太多,想深入精通太難

三、工資比別人高,同樣水平的C++服務端程序員工資會比Java,php的高

四、要特別了解系統底層,操作系統知識,指針這些


從入門到放棄(快逃


推薦閱讀:

TAG:編程語言 | C |