《重點大學計算機專業(yè)系列教材:新標準C++程序設計教程》基于新的C++標準“C++11”,從全新的思路出發(fā),融合作者豐富的編程實踐經(jīng)驗,深入淺出地全面介紹C++程序設計的過程,包含豐富的樣例程序,強調實踐性和專業(yè)性。
《重點大學計算機專業(yè)系列教材:新標準C++程序設計教程》適合作為高等院校理工類專業(yè)程序設計課程的教材、學生自學和做畢業(yè)設計的參考書,也可供IT從業(yè)人員和編程愛好者參考。
《重點大學計算機專業(yè)系列教材:新標準C++程序設計教程》面向大學計算機專業(yè)的低年級學生或非計算機專業(yè)但對編程能力要求較高的學生。內容深廣卻通俗易懂,入門與提高并重,覆蓋了C++語言的方方面面,尤其是全面介紹了標準模板庫STL的用法。 編者有十年的C++語言第一線教學經(jīng)驗,本書寫作時,就已經(jīng)將對學生困惑的解答融入其中,用精簡的語言直指問題的重點、難點和本質,力圖使讀者能獨立自學本書。 本書程序實例豐富實用,貼近編程實踐,強調程序設計基本思路、面向對象基本思想和算法的培養(yǎng),而不是僅僅羅列C++的語法規(guī)則。 本書書名中的“新標準”有兩層含義。一是指本書所有的講述和程序都是嚴格遵循C++標準的,而且介紹了一些最新C++11標準的內容。第二層含義更為重要,指的是希望讀者通過對本書的學習,對C++的掌握程度能夠達到更高的標準,除了深入理解面向對象的程序設計外,還能夠進行泛型程序設計并熟練使用STL。
一、 本書的寫作背景
C++功能強大、運用廣泛,許多大學都將其作為入門的程序設計語言進行教學。筆者在北京大學信息科學技術學院講授C++程序設計已有10年,隨著時間的推移,漸覺現(xiàn)有的教材已經(jīng)不能滿足教學的需要,于是萌生了自己編寫一本教材的想法。
C++有兩大特點: 支持面向對象的程序設計和支持泛型程序設計。然而,國內大部分教材往往對“泛型程序設計”這部分內容基本忽略,或只是略作交待。這導致許多學過或準備學C++的學生有如下印象:C++是為了編寫大型的程序而設計的,如果編寫一個十幾、幾十行的小程序,沒有必要用C++,用C語言就足夠了。實際上,編寫很小的程序用面向對象的程序設計方法確無必要,但不等于用C++沒必要。C++中的標準模板庫(STL)是泛型程序設計的最成功應用,其中包含許多常用的數(shù)據(jù)結構(如動態(tài)數(shù)組、棧等)和算法(如排序、二分查找等),STL即便應用于十幾行的程序中,也能有效地提高編程效率。對熟練的C++程序員來說,編寫一個十幾行的程序多半不會考慮到面向對象的程序設計,但會很自然地用到STL。在筆者看來,如果計算機專業(yè)的學生學了C++卻不會用STL,那么找工作面試的時候是會受影響的。C++標準委員會成員Andrew Koenig有句名言“庫設計就是語言設計,語言設計就是庫設計。”學了C++語言,卻不會用該語言的核心庫,對于計算機專業(yè)的學生來說,這樣的教學很難說是成功的。
國內大多數(shù)C++教材對泛型程序設計和STL講述甚少,國外雖有幾部經(jīng)典教材,全面覆蓋了C++的兩大特點,但是都卷帙浩繁,動輒近千頁,不適合初學者。為解決這個矛盾,筆者編寫了本教材,篇幅適當,全面講述了C++面向對象的各種特性,此外還覆蓋了標準模板庫90%以上的內容。初學者通過本書的學習,可以比較全面地掌握C++程序設計語言的精髓。
另外,大多數(shù)C++教材依據(jù)的是1998年的C++標準(一般稱為“C++98”)。而在1998年后,C++標準進行了一些修訂,加入了一些新特性,2011年C++標準委員會又通過了新的C++標準“C++11”。這些變化在大多數(shù)教材中沒有體現(xiàn)。讓教材與時俱進,也是筆者編寫本教材的初衷之一。
二、 本書的特點
1. 內容深廣卻通俗易懂,入門與提高并重
本書面向大學計算機專業(yè)的低年級學生,或非計算機專業(yè)但對編程能力要求較高的學生。本書可作為入門的程序設計語言教學之用,沒學過C語言的讀者可以直接學習本書。
本書內容很廣,覆蓋了C++語言的方方面面,全面講述了標準模板庫STL的用法,幾乎可以作為C++語言的參考手冊來查閱。第4篇“C++高級主題”中的內容更是大多數(shù)同等篇幅的教材所不曾涉及的。而且,由于本書的宗旨是讓讀者不但要知其然,還要知其所以然,因此對于C++的一些語法特性,不但介紹如何使用,還會講解C++為什么會有這個語法特性,甚至該特性是如何實現(xiàn)的,如“多態(tài)”的實現(xiàn)方法。
筆者有10年的C++語言第一線教學經(jīng)驗,非常清楚學生在學習C++時哪些地方不易掌握,會提出什么樣的問題,以及他們的問題應該如何回答。因此,在本書寫作時,就已經(jīng)將學生困惑的解答融入其中,用精簡的語言直指問題的重點、難點和本質,可以說將有限的文字都用在了刀刃上。筆者的目標是力圖做到“讀者不用教師講授,也能獨立看懂本書”。
2. 緊扣C++標準
國內大多數(shù)C++教材依據(jù)的是1998年的C++標準“C++98”。許多教材甚至都不能完全符合“C++98”的標準,這從其聲稱“程序都在Visual C++ 6.0中編譯通過”就可看出——Visual C++ 6.0并不是嚴格遵循“C++98”標準的編譯器。目前,對C++標準支持最好的編譯器有GNU gcc和微軟的Visual C++ 10.0(包含在Visual Studio 2010中)等。本書中的所有程序除個別有特殊說明的以外,都同時在Visual C++ 10.0和Dev C++ 4.9.9.2(其內核編譯器是gcc)中編譯通過,并且運行結果相同,可以保證是符合C++標準的,而不是某種“C++方言”。
最新的“C++11”標準通過的時間很短,目前還沒有編譯器能完全支持它。因此,本書不可能完全以“C++11”作為依據(jù)。本書的主要依據(jù)依然是“C++98”,但是收錄了幾個“C++98”之后新引入的特性,如“l(fā)ong long”數(shù)據(jù)類型、無序容器(即哈希表)、智能指針shared_ptr等。本書中的頭文件都是C++風格的,不像某些教材仍然使用C語言風格的頭文件。另外,許多教材中的程序在用到字符串時往往使用C語言風格的字符數(shù)組,而本書則盡量使用C++風格的string對象處理字符串。
3. 程序實例豐富實用,貼近編程實踐
筆者不僅具有豐富的C++教學經(jīng)驗,還有著數(shù)十萬行的C++商業(yè)軟件開發(fā)經(jīng)驗。筆者獨立開發(fā)了多種流行的英語學習軟件,如《我愛背單詞》、《我愛背句子》、《我愛學語法》、《我愛學音標》、《角斗士超級復讀機》等,還開發(fā)了背單詞的網(wǎng)站“愛單詞網(wǎng)”。這些軟件大量使用C++語言進行開發(fā),有的完全用C++寫成。因此,筆者自認為在對C++語言的運用和理解方面,比一般的教材作者多了一些心得,更能從實踐的角度闡述如何運用C++的各種特性。本書中所有樣例程序都由筆者精心編寫,絕非網(wǎng)上復制所得。程序風格優(yōu)美,貼近現(xiàn)實,對實踐的指導意義很強。
4. 強調程序設計基本思想的培養(yǎng)
筆者擔任北京大學ACM國際大學生程序設計競賽隊教練已有8年,手下的隊員都是北京大學最出色的編程高手。他們的成長、求學、求職經(jīng)歷可以驗證,算法才是程序設計的核心。學習程序設計決不是僅僅掌握一門語言的語法,更重要的是掌握算法。只掌握語言的語法,在碰到具體問題時往往還是不知道如何去編程解決。作為入門的程序設計語言教材,本書不可能講述太多的算法,但是程序設計的基本思想是必定要涉及的。為此,本書專門辟出一章,講述了枚舉、遞歸、二分3種基本的程序設計思想。此外,其他章節(jié)的一些例題和程序也能體現(xiàn)程序設計的基本思路。
三、 內容編排
本書主要分為以下四篇。
第1篇結構化程序設計: 是對C語言的繼承以及在C語言基礎上的一些擴充。學過C語言的讀者可以粗略閱讀甚至跳過此篇大部分內容,但是需要學習目錄中帶“*”的章節(jié),這些章節(jié)仍然是C語言中沒有的內容。
第2篇面向對象的程序設計: 包含類和對象、運算符重載、繼承、多態(tài)等內容,是C++語言的學習重點。
第3篇泛型程序設計: 包括如何編寫模板,以及如何使用標準模板庫STL。即便不想用面向對象的程序設計方法編程,學習STL也是大有裨益的。
第4篇C++高級主題: 涉及了異常處理、名字空間、C++風格的強制類型轉換等C++語言中比較深入的內容,以及C++11標準引入的幾個新特性。
本書各章最后都有小結和習題。各章內的講述中還穿插了許多思考題,思考題難度較大,很適合作為啟發(fā)式教學的討論話題。
四、 總結
總而言之,本書書名中的“新標準”有兩層含義: 第一層含義是指本書所有的講述和程序都是嚴格遵循 C++標準的,而且提及了一些新C++標準的內容; 第二層含義更為重要,指的是希望讀者通過本書的學習,對C++的掌握程度能夠達到更高的標準,除了深入理解面向對象的程序設計外,還能夠進行泛型程序設計并熟練使用STL。
本書的配套課件和書中的例題程序代碼可以從清華大學出版社網(wǎng)站(www.tup.com.cn)下載。如果在本書和課件的下載使用中遇到問題,請聯(lián)系fuhy@tup.tsinghua.edu.cn。
五、 鳴謝
編寫本書的動力來自作者在北京大學信息學院“程序設計實習”課程的教學經(jīng)歷。感謝課程主持人李文新教授對作者在教學中的支持和指導。還要感謝多年來共同講授此課程的余華山老師、田永鴻老師,和他們的討論使我獲益良多。三位老師編寫的講義,也是本書的重要參考。
感謝您選用本書。由于筆者水平所限,不足之處在所難免,歡迎讀者及同仁們批評指正,筆者不勝感激。
郭煒2012年6月于北京大學
郭煒,北京大學信息科學技術學院教師,北京大學ACM國際大學生程序設計競賽隊教練。不僅具有十年的C++教學經(jīng)驗,還有著數(shù)十萬行的C++商業(yè)軟件開發(fā)經(jīng)驗,獨立開發(fā)了多種流行的英語學習軟件(如我愛背單詞、我愛學語法、我愛學音標),創(chuàng)立了背單詞的網(wǎng)站——愛單詞網(wǎng)。精研算法,曾6次負責為ACM國際大學生程序設計競賽亞洲區(qū)預選賽命題,是國內為此項賽事主持命題次數(shù)最多的人。
第1篇 結構化程序設計
第1章 計算機基礎知識
1.1 信息在計算機中的表示和存儲
1.1.1 如何用0和1表示各種信息
1.1.2 二進制和十六進制
1.1.3 整數(shù)和小數(shù)的計算機表示
1.2 計算機程序設計語言
1.2.1 機器語言
1.2.2 匯編語言
1.2.3 高級語言
1.3 C++語言的歷史
1.4 小結
習題
第2章 C++語言的基本要素
2.1 C++的標識符
2.2 C++的關鍵字
2.3 最簡單的C++程序
2.4 變量
2.4.1 變量的定義
2.4.2 變量的初始化
2.4.3 變量的賦值
2.4.4 常變量
2.5 C++的數(shù)據(jù)類型
2.5.1 C++基本數(shù)據(jù)類型
2.5.2 數(shù)據(jù)類型自動轉換
2.5.3 用cin讀人類型不同的變量
2.6 常量
2.6.1 整型常量
2.6.2 實數(shù)型常量
2.6.3 布爾型常量
2.6.4 字符型常量
2.6.5 字符串常量
2.6.6 符號常量
2.7 運算符和表達式
2.7.1 算術運算符
2.7.2 賦值運算符
2.7.3 關系運算符
2.7.4 邏輯運算符和邏輯表達式
2.7.5 位運算符
2.7.6 條件運算符
2.7.7 sizeof運算符
2.7.8 強制類型轉換運算符
2.7.9 逗號運算符
2.7.10 運算符的優(yōu)先級和結合性
2.8 注釋
2.9 小結
習題
第3章 C++語言的控制結構
3.1 用if語句實現(xiàn)選擇結構
3.2 用switch語句實現(xiàn)選擇結構
3.3 用for語句實現(xiàn)循環(huán)結構
3.4 用while語句實現(xiàn)循環(huán)結構
3.5 用dowhile語句實現(xiàn)循環(huán)結構
3.6 用break語句跳出循環(huán)
3.7 continue語句
3.8 goto語句
3.9 使用freopen方便程序調試
3.10 小結
習題
第4章 函數(shù)
4.1 函數(shù)的定義和調用
4.1.1 函數(shù)的定義
……
第2篇 面向對象的程序設計
第3篇 泛型程序設計
第4篇 C++高級主題