C++之父談C++ :一天之內你就能學會出色使用C++
文章轉自:臥浪居士 (文末有彩蛋)
1. 請談談C++書。
沒有,也不可能有一本書對於所有人來說都是最好的。不過對於那些真正的程式設計師來說,如果他喜歡從“經典風格”的書中間學習一些新的概念和技術,我推薦我的The C++ Programming Language, 1998年的第三版和特別版。那本書講的是純而又純的C++,完全獨立於平臺和庫(當然得講到標準庫)。該書面向那些有一定經驗的程式設計師,幫助他們掌握C++,但不適合毫無經驗的初學者入門,也不適合那些臨時程式設計師品嚐C++快餐。所以這本書的重點在於概念和技術,而且在完整性和精確性上下了不少功夫。如果你想知道為什麼C++會變成今天的模樣,我的另一本書The Design and Evolution of C++ 能給你滿意的答案。理解設計的原則和限制能幫助你寫出更好的程式。www.accu.com是最好的書評網站之一,很多有經驗的程式設計師在此仗義執言,不妨去看看。也推薦C++課程:1.《C語言/C++學習指南》單步除錯,《C語言/C++學習指南》語法篇(從入門到精通), C++面試筆試精要,《C語言/C++學習指南》Qt介面開發篇,《C語言/C++學習指南》動態庫和靜態庫。2.C Primer,用ffmpeg開發螢幕錄製,C++ Boost庫程式設計,利用webrtc搭建視訊會議系統。
2. 學習C++要花多長時間?
這要看你說的“學習”是什麼意思了。如果你是一個Pascal程式設計師,你應該能很快地使你的C++水平達到與Pascal相近的程度;而如果你是一個C程式設計師,一天之內你就能學會使用C++進行更出色的C風格程式設計。另一方面,如果你想完全掌握C++的主要機制,例如資料抽象,物件導向程式設計,通用程式設計,物件導向設計等等,而此前又對這些東西不很熟悉的話,花上個一兩年是不足為奇的。那麼是不是說這就是學習C++所需要的時間呢?也許再翻一番,我想打算成為更出色的設計師和程式設計師最起碼也要這麼長的時間。如果學習一種新的語言不能使我們的工作和思想方式發生深刻的變革,那又何苦來哉?跟成為一個鋼琴家或者熟練掌握一門外語相比,學習一種新的、不同的語言和程式設計風格還算是簡單的。
3. 瞭解C是學習C++的先決條件嗎?
否!C++中與C相近的子集其實比C語言本身要好學,型別方面的錯誤會少一些,也不像C那樣繞圈子,還有更好的支援庫。所以應該從這個子集開始學習C++。
4. 要想成為真正的OO程式設計師,我是不是得先學習Smalltalk?
否。如果你想學Smalltaok,儘管去學。這種語言很有趣,而且學習新東西總是一個好主意。但是Smalltalk不是C++,而且把Smalltalk的程式設計風格用在C++裡不會有什麼好結果。如果你想成為一個出色的C++程式設計師,而且也沒有幾個月的時間百無聊賴,請你集中力量學好C++以及其背後的思想。
5. 我如何開始學習C++?
這取決於你的基礎和學習動機。如果你是個初學者,我想你最好找個有經驗的程式設計師來幫助你,要不然你在學習和實踐中不可避免的犯下的種種錯誤會大大地打擊你的積極性。另外,即使你的編譯器配備了充足的文件資料,一本C++書籍也永遠是必不可少的,畢竟文件資料不是學習程式設計思想的好教材。
選擇書籍時,務必注意該書是不是從一開始就講授標準C++,並且矢志不渝地使用標準庫機制。例如,從輸入中讀取一個字串應該是這樣的:
string s; // Standard C++ style
cin >> s;
而不是這樣的:
char s【MAX】; /* Standard C style */
scanf("%s",s);
去看看那些紮實的C++程式設計師們推薦的書吧。記住,沒有哪本書對所有人來說都是最好的。
另外,要寫地道的C++程式,而避免用C++的語法寫傳統風格的程式,新瓶裝舊酒沒多大意義。
(遺憾的是,目前在市面上的中文C++教材中,符合B. S的這個標準的可以說一本都沒有,大家只好到網上找一些英文的資料來學習了。——譯者)
6. 怎樣改進我的C++程式?
不好說。這取決於你是怎麼使用該語言的。大多數人低估了抽象類和模板的價值,反過來卻肆無忌憚地使用造型機制(cast)和巨集。這方面可以看看我的文章和書。抽象類和和模板的作用當然是提供一種方便的手段建構單根的類層次或者重用函式,但更重要的是,它們作為介面提供了簡潔的、邏輯性的服務表示機制。
7. 語言的選擇是不是很重要?
是,但也別指望奇蹟。很多人似乎相信某一種語言能夠解決他們在系統開發中遇到的幾乎所有問題,他們不斷地去尋找完美的程式語言,然後一次次的失敗,一次次的沮喪。另外一些人則將程式語言貶為無關緊要的細節,把大把大把的銀子放在開發流程和設計方法上,他們永遠都在用著COBOL, C和一些專有語言。一種優秀的語言,例如C++,能幫助設計者和程式設計師做很多事情,而其能力和缺陷又能夠被清楚地瞭解和對待。
8. ANSI/ISO標準委員會是不是糟蹋了C++?
當然不是!他們(我們)的工作很出色。你可以在一些細節上找些歪理來挑刺,但我個人對於這種語言以及新的標準庫可是欣欣然。ISO C++較之C++的以前版本更出色更有條理。相對於標準化過程剛剛開始之初,你今天可以寫出更優雅、更易於維護的C++程式。新的標準庫也是一份真正的大禮。由於標準庫提供了strings, lists, vectors, maps以及作用於其上的基本演算法,使用C++的方式已經發生了巨大的變化。
9. 你現在有沒有想刪除一些C++特性?
沒有,真的。問這些問題的人大概是希望我回答下面特性中的一個:多繼承、異常、模板和RTTI。但是沒有它們,C++就是不完整的。在過去的N年中,我已經反覆考慮過它們的設計,並且與標準委員會一起改進了其細節,但是沒有一個能被去掉又不引起大地震。
從語言設計的角度講,我最不喜歡的部分是與C相容的那個子集,但又不能把它去掉,因為那樣對於在現實世界裡工作的程式設計師們來說傷害太大了。C++與C相容,這是一項關鍵的設計決策,絕對不是一個叫賣的噱頭。相容性的實現和維護是十分困難的,但確實使程式設計師們至今受益良多。但是現在,C++已經有了新的特性,程式員們可以從麻煩多多的C風格中解脫出來。例如,使用標準庫裡的容器類,象vector,list, map, string等等,可以避免與底層的指標操作技巧混戰不休。
10. 如果不必和C相容,你所創造的語言是不是就會是Java?
不是,差得遠。如果人們非要拿C++和Java來作比較,我建議他們去閱讀The Design and Evolution of C++,看看C++為什麼是今天這個樣子,用我在設計C++時遵從的原則來檢驗這兩種語言。這些原則與SUN的Java開發小組所持的理念顯然是不同的。除了表面語法的相似性之外,C++與Java是截然不同的語言。在很多方面,Java更像Smalltalk(譯者按:我學習Java時用的是Sun的培訓教材,裡面清楚地寫道:Java在設計上採用了與C++相似的語法,與Smalltalk相似的語義。所以可以說Java與C++是貌合神離,與Smalltalk才是心有靈犀)。Java語言相對簡單,這部分是一種錯覺,部分是因為這種語言還不完整。隨著時間的推移,Java在體積和複雜程度上都會大大增長。在體積上它會增長兩到三倍,而且會出現一些實現相關的擴充套件或者庫。這是一條每個成功的商業語言都必須走過的發展之路。隨便分析一種你認為在很大範圍內取得了成功的語言,我知道肯定是無有例外者,而且實際上這非常有道理。
上邊這段話是在Java 1.1推出之前寫的。我確信Java需要類似模板的機制,並且需要增強對於固有型別的支援。簡單地說,就是為了基本的完整性也應該做這些工作。另外還需要做很多小的改動,大部分是擴充套件。1998年秋,我從James Gosling(Java語言的創始人——譯者)那裡得到一份建議書,說是要在Java中增加固有型別、操作符過載以及數學計算支援。還有一篇論文,是數學分析領域的世界級大師,伯克利大學的W. Kahan教授所寫的How Java’s Floating-Point Hurts Everyone Everywhere(“且看Java的浮點運算如何危害了普天下的芸芸眾生”——譯者),揭露了Java的一些祕密。
文末彩蛋:
1.CSDN學院助學會員:僅需百元- 1300門課+600次下載特權,一次購買,全年無憂!點選檢視。
2.CSDN學院知識週刊:每週更新學院優惠課程活動及精品上新內容,點選檢視!
3.本期推薦C++課程:部分課程限時1元
《C語言/C++學習指南》單步除錯,《C語言/C++學習指南》語法篇(從入門到精通), C++面試筆試精要,《C語言/C++學習指南》Qt介面開發篇,《C語言/C++學習指南》動態庫和靜態庫,C Primer,用ffmpeg開發螢幕錄製,C++ Boost庫程式設計,利用webrtc搭建視訊會議系統。
相關文章
- C++之父Bjarne談C++在2005年(轉)C++JAR
- C/C++的思索 C++之父訪談錄 [上帝的玩笑嗎?] (轉)C++
- 首個 C++ 編譯器誕生 30 週年了,來聽聽 C++ 之父暢談 C++C++編譯
- C++之父:C++ 的五個普遍誤解(3)C++
- C++之父:C++ 的五個普遍誤解(1)C++
- C++、C++學習之我見 (轉)C++
- 學懂現代C++——《Effective Modern C++》之轉向現代C++C++
- 細學C++之C++語言的特點C++
- C++之父Bjarne Stroustrup訪談問題有獎徵集(圖靈訪談)C++JAR圖靈
- “21天教你學會C++”C++
- 21天教你學會C++C++
- C++基礎學習第一天C++
- 跟我一起學習C++ 之 初識C++C++
- 【C++】C++之Lambda表示式C++
- C++效率(二)C++行內函數C++函數
- C++ STL學習之stack。C++
- 【C++】C++之型別轉換C++型別
- C++學習第一天--編譯命令C++編譯
- C++學習步驟(C++該如何學)C++
- 掀起C++0x的蓋頭來:C++之父Bjarne Stroustrup訪談C++JAR
- C++之父B. Stroustrup近期言論 (轉)C++
- C++之templateC++
- C++學習筆記——C++ 繼承C++筆記繼承
- C++ string (淺談)C++
- C++學習之路——第一天(結構體、C++程式從編寫到執行)C++結構體
- C++ 學習筆記之 引用C++筆記
- 0.C/C++學習漫談前言C++
- 學習C++C++
- c++學習C++
- C++入門(2):為何還學C++?C++
- 【C++】由Polocar 學習 C++物件導向C++物件
- C++——內聯,友元C++
- C++行內函數C++函數
- c++ sizeof使用C++
- 2020 重學 C++ 重構你的 C++ 知識體系C++
- 學懂現代C++——《Effective Modern C++》之型別推導和autoC++型別
- C++之父:將工作視為一種樂趣C++
- Git為何不用C++開發:Linux之父痛貶C++的經典郵件GitC++Linux