C++ 究竟難在哪裏?

C語言與CPP編程 2021-09-19 15:01:08 阅读数:232

c++ 究竟 在哪

C++對比其他語言到底難在哪裏?有人對C++异常推崇,除了性能優勢,還有什麼優點,怎麼學好C++?

c471f88cc5d547335067157a884b3fd8.png

01

C++的能力上限非常高,可以說在軟件領域沒有C++做不好和做不到的事情,只是開發者水平和成本問題,而C++之後出現的語言都有些無論如何都做不好或根本做不到的事情。

C++雖然能力上限高,但是達到這個上限對開發者的要求也很高,不是普通程序員可以做到的。

其它語言雖然上限低,但是只要不去碰那些極端要求的領域,在各自的優勢領域裏還是能超越C++的,對工程師要求也沒那麼高,但是在全領域超越C++的目前還沒有。

C++的難點在於給開發者的自由度太高了,什麼都可以做,限制很少,導致水平不够的人也可以胡搞瞎搞,把代碼寫的亂七八糟,然後怪C++太難太複雜。

學好C++,最重要的是你要有學C++的需求,就是個人目標是要成為頂級程序員,成為開發基礎設施,設計構建軟件平臺的人,沒有宏大的理想不會有足够的動力去學C++的,過程中太多困難會導致放弃的。

長期來看,C++還是會被取代的,只是這個長期非常長,可以入選有生之年系列。

可以看到在最近幾年新出現的軟件項目裏,C++的使用率已經在下降了,但是很多曆史悠久的基礎設施類的項目基本都是C++,這些項目生命周期都很長,不會輕易被淘汰。

作者:姚冬
https://www.zhihu.com/question/311845619/answer/610895557

02

cfd383e947a166e56c2b35fbe3f748cc.png

項目構建看上去似乎是個攔路虎,不過結合現代cmake之後,很複雜的工程也其實可以構建得很簡單。

難在範式多。範式多其實並不難,真正難在各範式的最佳實踐相當不明確。過程式和傳統c with class的最佳實踐還是比較明確的,多看看GTK和QT就差不離。但是現代C++偏重於靜態决定和半函數式,而且本身還在劇烈演進中,這兩個方向上,最佳實踐比較匱乏,尤其是大規模工程化的最佳實踐。我看過微軟、facebook的幾個現代C++開發框架,還是感覺過於玩具化,跟我自己的開發方式也區別很大,當然我自己是簡單至上的,不算完全的通用化方案。

那麼真正的難度就在於取舍。如何做業務抽象,以何種形式來做抽象,如何平衡複雜與簡潔度,如何確認各技術和模塊的邊界,如何綜合運用多範式就很考驗經驗和性格。

說點性能以外的優勢吧。C++ 11之後,一向是我認為最佳的工程語言,控制力極强。重點在於靜態决定和操作簡化。

C++盡量少搞動態OOP,理論上不成問題,但是實際語法相當麻煩,而且弄多了就很容易出現像python一樣的問題,重構困難。所以基於極强的類型化體系和模板體系,在開發體系的抽象和重構性上,可以達到一個相當舒服的地步。盡可能的靜態决定可以避免很多手工錯誤。

C++寫庫那是各種手段都可以用上的,但是寫完了,可以做到使用極其簡單。我個人就覺得和typescript比較像,用起來有時候還要簡單一些。

再結合C++20的concept這種前置類型條件,constract這種前置邊界後置邊界,寫代碼就更舒服了。

作者:王旭競

https://www.zhihu.com/question/311845619/answer/594847911

03

0d0f5a45b91330135b46130817b2fbb7.png

C++對比其他語言到底難在哪裏?概念多;

未定義行為多,編譯通過不錶明你可以那麼寫;

存在大量語言之外的東西。語言本身只定義到編譯單元,但後面還有靜態庫、動態庫、工程化的一堆事情。

最重要的,你不得不學會絕大部分概念。所謂“只使用語言的一部分特性”在稍微大點的工程裏是做不到的,因為第三方庫會强制你使用那些你原本不打算用的概念。

除了性能優勢,還有什麼優點?

性能優勢不是特點,因為有太多的語言是注重性能的:不論是更老的C、Objective C,還是比較新的C#、Rust。

C++的關鍵特點,是有性能優勢的同時提供了足够多的抽象能力,使得它有能力構建比較複雜的系統(vs C);同時又出現得足够早,有足够的曆史包袱:大量已存在的SDK使用C++,於是你不得不用C++(vs C#、Rust)。

怎麼學好C++?

我也不知道。我第一個真正學習的語言是Perl,然後使用裸奔類比學會了C++。

總之,你需要掌握:

裸奔概念(比如class無非就是有行為的結構體,method無非就是函數,template無非就是某種代碼生成規則)。

業務系統的分割、組織,這對於所有的編程都是需要的。

從項目中學習。沒有項目就自己做點小玩具。

版权声明:本文为[C語言與CPP編程]所创,转载请带上原文链接,感谢。 https://gsmany.com/2021/09/20210919150108322d.html