C++之父談C++:一天之內你就能學會出色使用C++

引言:

精通C++是一個艱鉅的任務。爲什麼C++比別的語言難學那麼多?其實這基本上是因爲C++之父Bjarne Stroustrup 說過的一句話“我特別的討厭語言的設計者把自己的喜好強加給用戶”(看向go)。結果C++爲了不限制你的想法,於是也就變成了現在的樣子-- ,那麼如何學好C++,甚至是出色掌握C++?

Sheet1 Sheet2Sheet3

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搭建視頻會議系統。

  1. 學習C++要花多長時間?

這要看你說的“學習”是什麼意思了。如果你是一個Pascal程序員,你應該能很快地使你的C++水平達到與Pascal相近的程度;而如果你是一個C程序員,一天之內你就能學會使用C++進行更出色的C風格編程。另一方面,如果你想完全掌握C++的主要機制,例如數據抽象,面向對象編程,通用編程,面向對象設計等等,而此前又對這些東西不很熟悉的話,花上個一兩年是不足爲奇的。那麼是不是說這就是學習C++所需要的時間呢?也許再翻一番,我想打算成爲更出色的設計師和程序員最起碼也要這麼長的時間。如果學習一種新的語言不能使我們的工作和思想方式發生深刻的變革,那又何苦來哉?跟成爲一個鋼琴家或者熟練掌握一門外語相比,學習一種新的、不同的語言和編程風格還算是簡單的。

  1. 瞭解C是學習C++的先決條件嗎?

否!C++中與C相近的子集其實比C語言本身要好學,類型方面的錯誤會少一些,也不像C那樣繞圈子,還有更好的支持庫。所以應該從這個子集開始學習C++。

  1. 要想成爲真正的OO程序員,我是不是得先學習Smalltalk?

否。如果你想學Smalltaok,儘管去學。這種語言很有趣,而且學習新東西總是一個好主意。但是Smalltalk不是C++,而且把Smalltalk的編程風格用在C++裏不會有什麼好結果。如果你想成爲一個出色的C++程序員,而且也沒有幾個月的時間百無聊賴,請你集中力量學好C++以及其背後的思想。

  1. 我如何開始學習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的這個標準的可以說一本都沒有,大家只好到網上找一些英文的資料來學習了。——譯者)

  1. 怎樣改進我的C++程序?

不好說。這取決於你是怎麼使用該語言的。大多數人低估了抽象類和模板的價值,反過來卻肆無忌憚地使用造型機制(cast)和宏。這方面可以看看我的文章和書。抽象類和和模板的作用當然是提供一種方便的手段建構單根的類層次或者重用函數,但更重要的是,它們作爲接口提供了簡潔的、邏輯性的服務表示機制。

  1. 語言的選擇是不是很重要?

是,但也別指望奇蹟。很多人似乎相信某一種語言能夠解決他們在系統開發中遇到的幾乎所有問題,他們不斷地去尋找完美的編程語言,然後一次次的失敗,一次次的沮喪。另外一些人則將編程語言貶爲無關緊要的細節,把大把大把的銀子放在開發流程和設計方法上,他們永遠都在用着COBOL, C和一些專有語言。一種優秀的語言,例如C++,能幫助設計者和程序員做很多事情,而其能力和缺陷又能夠被清楚地瞭解和對待。

  1. ANSI/ISO標準委員會是不是糟蹋了C++?

當然不是!他們(我們)的工作很出色。你可以在一些細節上找些歪理來挑刺,但我個人對於這種語言以及新的標準庫可是欣欣然。ISO C++較之C++的以前版本更出色更有條理。相對於標準化過程剛剛開始之初,你今天可以寫出更優雅、更易於維護的C++程序。新的標準庫也是一份真正的大禮。由於標準庫提供了strings, lists, vectors, maps以及作用於其上的基本算法,使用C++的方式已經發生了巨大的變化。

  1. 你現在有沒有想刪除一些C++特性?

沒有,真的。問這些問題的人大概是希望我回答下面特性中的一個:多繼承、異常、模板和RTTI。但是沒有它們,C++就是不完整的。在過去的N年中,我已經反覆考慮過它們的設計,並且與標準委員會一起改進了其細節,但是沒有一個能被去掉又不引起大地震。

從語言設計的角度講,我最不喜歡的部分是與C兼容的那個子集,但又不能把它去掉,因爲那樣對於在現實世界裏工作的程序員們來說傷害太大了。C++與C兼容,這是一項關鍵的設計決策,絕對不是一個叫賣的噱頭。兼容性的實現和維護是十分困難的,但確實使程序員們至今受益良多。但是現在,C++已經有了新的特性,程序員們可以從麻煩多多的C風格中解脫出來。例如,使用標準庫裏的容器類,象vector,list, map, string等等,可以避免與底層的指針操作技巧混戰不休。

  1. 如果不必和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的一些祕密。

附:C++教程推薦:

《C語言/C++學習指南》單步調試,《C語言/C++學習指南》語法篇(從入門到精通), C++面試筆試精要,《C語言/C++學習指南》Qt界面開發篇,《C語言/C++學習指南》動態庫和靜態庫,C Primer,用ffmpeg開發屏幕錄製,C++ Boost庫編程,利用webrtc搭建視頻會議系統。

祝福大家!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章