C++中有哪些設計精良的部分(精華),還有哪些是不值得花費很多時間探究的知識點?


不值得花時間的有:

become a language lawyer

iostream manipulators

auto_ptr

valarray

exception specifications

multiple / virtual inherence

obsolete library like bind_1st, etc.


很多人駕馭不了c++的template,多繼承,虛函數,操作符重載,raii,……,因此就抱怨這些概念都不好。卻不承認自己的抽象能力不足。其實,c++也真是奇葩,很多本該語言層面提供的工具,都首先堅持要用庫來,雖然,用庫做出來的特性沒有人家原生的好,但是,卻也證明了c++表達能力的強悍,看看其他這些語言弱雞,我大c++通過種種奇技淫巧,可以做鴨子類型,可以做gc,可以實現go那樣的介面,如果願意大面積的使用宏,還能做功能強大的反射以及其他種種的怪物。所有其他的語言的特性,c++都可用有匪夷所思的手法在很大程度上的模擬。

總之,好不好還是要看代碼量,看類型安全。好比qsort,必須傳遞什麼元素大小的參數,還有參數的比較大小的函數指針,通過template,就可以取到數組單個元素的大小,再結合triats,就能推導到比較元素大小的函數指針,就這樣通過template就可以給qsort自動補充兩個參數,這難道不是用起來更爽。

用c++不會妨礙碼農用c風格的方式寫代碼,但是,卻可以通過template還有各種強大豐富的類型的信息,可以讓編譯器自動生成代碼並通過強類型找出潛在的錯誤,總之,強大的工具就在手裡,愛用不用。所有c之中有類型隱患有重複代碼的地方,都可以用c++消除,好比sprintf,setsockopt,還有iup那樣子,等等,只能通過字元串來設置各個窗口的屬性,實在是很弱雞的表現


半桶水請不要評論template,謝謝 :)


設計精良:RAII、模板(爭議?)等等

不值得花時間的有:各種Undefined Behavior、 求值順序(這個就是個歷史遺留的大坑)

事實上每次C++標準的更改都會刪掉一些不良的設計 比如 @陳碩在他的答案中提到的exception specifications和過時的標準庫內容等 也會帶來新的改進和特性 這些變換固然提高了學習成本 但是卻實實在在地增強了C++的實用性(我已經離不開C++11了)


精良的部分(之一)就是把template設計成了一個圖靈完備的語言。

當然對於很多寫代碼的來說這部分其實不太值得他們花時間。

因為你愛用不用


stl的容器和演算法是精華部分,而面向對象方面則會用就好。


有一個設計精良的部分:模擬其他語言


C++能有今天一是因為兼容C,二是因為OOP特性,如今這兩條卻是被C艹粉絲們黑的最慘的。

然而前者不是設計精良——繼承了C的所有坑,哪怕你刻意用現代C++特性也繞不開,並且加上C++的坑完美的實現1+1&>2;後者不值得花時間——太簡單了。

除此之外都是垃圾的,比如RAII不過是屎一樣的賦值語義恰好能實現之罷了,RAII、引用計數從語言級實現可以更加安全,不至於不得已用裸指針的時候大大增加複雜性,而賦值語義壓根就可以不存在,也不至於屎了這麼多年再來個移動語義去填坑。

PS:C++粉絲極力跟面向對象和C撇開關係,這種過河拆橋卸磨殺驢的行為乃是不忠不義之舉,為人不齒。


請都認真學,即使在實際編程里不常用的也都是很有價值的東西,包括這種東西設計的思想。

模板大法怎能不認真學!


可以看看:OO C is passable

C++ 在面向對象方面比 OO C 好的也就是:

  • 不用手工初始化 virtual table,
  • 語法上不用寫 obj-&>(obj, a), 直接寫 obj-&>(a)。
  • 可以比較方面的進行實現繼承(implementation inheritance)。

其它都是敗筆。


請不要強行答題


  • 我知道很多人不同意,但是我還是覺得template系統是C++最不好的特性。template使得C++成為了一個不meta programming就不能過日子的怪物系統,並且通過STL深遠地影響了所有的第三方庫。不妨這樣想:C沒有template,依然可以表達各種演算法,依然是最快的系統,那麼STL其實是無所謂的
  • 另外exception機制也應該去掉。由於exception可以從任意一行跳出,對於分析代碼健壯性是個巨大的心智負擔。C根本沒有這個問題,所以編寫良好的C程序比C++程序更健壯。而且沒有exception就可以擺脫RAII/RIIA這種醜陋的模式了

回到Cfront那種"C with Classes"對於C++來說是最好的設計


個人覺得C++的魅力之處在於他既有著C的性能和廣泛受眾,又用面向對象的方式很大程度解決了內存釋放問題。


個人覺得c是加減法,oop是乘除法,template是微積分。掌握到那個程度看自己的能力。


模板元編程在高性能數值計算上有重要應用,具體可參考arma庫 eigen庫


template,要學要用,但是不要花時間深究。單單的template是沒有卵用的,只有與業務代碼結合才會發揮其強大的作用。所以有需要了才去研究會比較好。

還有一些stl,boost這些基礎庫,有需要才去翻!


template,模板是個好東西,但現在用的太濫


精良的部分就是我們經常說的oop的幾個點,繼承,封裝和多態,構造析夠。不精良的就是寫出來,讓一個工作幾年的人來看還看不懂,說明這玩意一是用的少,而是比較難理解


推薦閱讀:

C++類對象內存大小的計算?
C++ 什麼時候不應該用虛函數?
C++ 一個 class 裡面全部是靜態函數,這種設計目的是什麼?

TAG:編程 | 面向對象編程 | C | C應用 | C11 |