程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 探秘C++的復雜性問題

探秘C++的復雜性問題

編輯:C++入門知識

你用一個天生用來開啤酒瓶的工具開了啤酒瓶,不但啥成就感也沒有,而且誰也不會覺得你牛13。然而,如果你發明了一種用兩根筷子也能打開啤酒瓶的辦法,或者你干脆生就一口好牙可以把瓶蓋啃開,那也許就大不一樣了。人家就會覺得你很好很強大。

每個人都喜歡戴著腳鐐跳舞。

也就是說,如果你用一個天生為某個目的的工具來做他該做的事情,沒有人會喝彩,你也不會覺得了不起。但如果你用兩個本身不是為某個目的的工具組合出新功能的話,你就是“創新”者盡管也許本來就有某個現成的工具可用)。

而C++則是這些“創新”的土壤,是的,我說的就是無窮無盡的workarounds和慣用法。但問題是,這些“創新”其實根本不是創新,你必須認識到的是,他們都只不過是在沒有first-class解決方案的前提下不得已折騰出來的替補方案。是的,它們某種程度上的確可以叫創新,甚至研究可行的解決方案本身也是一件非常有意思的事情,但—

我知道它們很有趣,但實際上它們只是補丁方案。

是的,不要因為這些“創新”方案有趣就忍不住一頭鑽進去。你之所以覺得有趣是因為當你一定程度上熟悉了C++之後,C++的所有一切,包括缺陷,對你來說就成了一個“既定事實”,一個背景,一個習以為常的東西人是有很強的適應性的)。因此,當你發現在這個習以為常的環境下居然出現了新的可能性時,你當然是會歡呼雀躍的比如我當年讀《Modern C++ Design》的時候就有一次從早讀到晚,午飯都沒吃),然而實際上呢?其它語言中也許早就有first-class的支持了,其它語言也許根本不需要這個慣用法,因為它們就沒有這些缺陷。此外,從實踐的角度來說,更重要的是,這些“解決方案”也許你平時編程根本就用不到。

不,我當然不是說這些補丁方案不重要。正如前面所說,C++中繁雜的技巧並非空穴來風,總有實際問題在背後驅動的。但問題是,對於我們日常編程來說,這些“實際問題”簡直是八桿子打不著的。犯不著先費上80%的勁兒把20%時候才用到的東西揣在腦子裡,用的時候查文檔或書就行了。

  • 闡述C++編譯器變量進行優化說明
  • 對於C++數據類型說明
  • 豐富多彩的C/C++程序設計
  • 玩轉C++ 托管技術簡介
  • 如何更好的實現C++編譯

看到這裡,塑造C++中特定的心態哲學的另一個原因想必你也已經知道了。實際上,這個原因才是真正根本的。前面說的一個原因是C++書籍市場教育)造就的,然而為什麼人們喜歡寫這些書呢?進一步說,為什麼人們喜歡讀這些書呢?我承認,我也曾經讀得津津有味。)答案很簡單:心理。每個人都喜歡戴著腳鐐跳舞事實8)。認識到這一點不是為了提倡它,而是只有當我們認識到自己為什麼會津津有味地去鑽研一堆補丁解決方案的時候,我們才真正能夠擺脫它們的吸引。

總而言之,C++的復雜性只是一個必要條件,並非問題的根本症結。根本症結在於人的心理,每個人都喜歡戴著腳鐐跳舞,並且以為是“創新”。意識到這一點之後可以幫我們避免被各種各樣名目繁多的語言細節和技巧占去不必要的時間。

然而,C++的復雜性始終是一個不可回避的現實。C++中有大量的陷阱和缺陷,後者導致了數目驚人的慣用法和workarounds。不加選擇的全盤預先學習,是非常糟糕的做法,不僅低效,而且根本沒有必要,實在是浪費生命。愛因斯坦曾經說過,“我只想知道‘他’宇宙)的設計理念,其它的都是細節”。然而,正如另一些讀者指出的,如果對C++中的這些細節事先一點都沒有概念的話,那麼實際編碼中一旦遇到恐怕就變成沒頭蒼蠅了,也許到哪裡去RTFM都不知道。這也是為什麼那麼多C++面試都會不厭其煩地問一些有代表性的語言細節的原因。

把細節全盤裝在腦子裡固然不好,但對細節一無所知同樣也不是個辦法。那麼對於C++程序員來說,在學習中究竟應該以怎樣的態度和學習方法來對付C++的復雜性呢?其實答案也非常簡單,首先有一些很重要&必須的語言細節&特性是需要掌握的,然後我們只需知道在C++中大抵有哪些地方有復雜性陷阱、缺陷),那麼遇到問題的時候自然能夠知道到哪兒去尋找答案了。具體的建議在後文。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved