本節書摘來自華章出版社《 c++程式設計:原理與實踐(進階篇)》一書中作者[美] 本賈尼·斯特勞斯特魯普(bjarne stroustrup) 著
劉曉光 李忠偉 王剛 譯
更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。
前 言
programming: principles and practice using c++, second edition
該死的魚雷!全速前進。
——admiral farragut
程式設計是這樣一門藝術,它将問題求解方案描述成計算機可以執行的形式。程式設計中很多工作都花費在尋找求解方案以及對其求精上。通常,隻有在真正編寫程式求解一個問題的過程中才會對問題本身了解透徹。
本書适合于那些從未有過程式設計經驗但願意努力學習程式設計技術的初學者,它能幫助讀者了解使用c++語言進行程式設計的基本原理并獲得實踐技巧。本書的目标是使你獲得足夠多的知識和經驗,以便能使用最新、最好的技術進行簡單有用的程式設計工作。達到這一目标需要多長時間呢?作為大學一年級課程的一部分,你可以在一個學期内完成這本書的學習(假定你有另外四門中等難度的課程)。如果你是自學的話,不要期望能花費更少的時間完成學習(一般來說,每周15個小時,14周是合适的學時安排)。
三個月可能看起來是一段很長的時間,但要學習的内容很多。寫第一個簡單程式之前,就要花費大約一個小時。而且,所有學習過程都是漸進的:每一章都會介紹一些新的有用的概念,并通過真實應用中的例子來闡述這些概念。随着學習程序的推進,你通過程式代碼表達思想的能力——讓計算機按你的期望工作的能力,會逐漸穩步地提高。我絕不會說:“先學習一個月的理論知識,然後看看你是否能使用這些理論吧。”
為什麼要學習程式設計呢?因為我們的文明是建立在軟體之上的。如果不了解軟體,那麼你将退化到隻能相信“魔術”的境地,并且将被排除在很多最為有趣、最具經濟效益和社會效益的領域之外。當我談論程式設計時,我所想到的是整個計算機程式家族,從帶有gui(圖形使用者界面)的個人計算機程式,到工程計算和嵌入式系統控制程式(如數位相機、汽車和手機中的程式),以及文字處理程式等,在很多日常應用和商業應用中都能看到這些程式。程式設計與數學有些相似,認真去做的話,會是一種非常有用的智力訓練,可以提高我們的思考能力。然而,由于計算機能做出回報,程式設計不像大多數數學形式那麼抽象,因而對多數人來說更易接受。可以說,程式設計是一條能夠打開你的眼界,将世界變得更美好的途徑。最後,程式設計可以是非常有趣的。
為什麼學習c++這門程式設計語言呢?學習程式設計是不可能不借助一門程式設計語言的,而c++直接支援現實世界中的軟體所使用的那些關鍵概念和技術。c++是使用最為廣泛的程式設計語言之一,其應用領域幾乎沒有局限。從大洋深處到火星表面,到處都能發現c++程式的身影。c++是由一個開放的國際标準組織全面考量、精心設計的。在任何一種計算機平台上都能找到高品質的、免費的c++實作。而且,用c++所學到的程式設計思想,大多數可直接用于其他程式設計語言,如c、c#、fortran以及java。最後一個原因,我喜歡c++适合編寫優美、高效的代碼這一特點。
本書不是初學程式設計的最簡單入門教材,我寫此書的用意也不在此。我為本書設定的目标是——這是一本能讓你學到基本的實用程式設計技術的最簡單書籍。這是一個非常雄心勃勃的目标,因為很多現代軟體所依賴的技術,不過才出現短短幾年時間而已。
我的基本假設是:你希望編寫供他人使用的程式,并願意認真負責地以較高品質完成這個工作,也就是說,假定你希望達到專業水準。是以,我為本書選擇的主題覆寫了開始學習實用程式設計技術所需要的内容,而不隻是那些容易講授和容易學習的内容。如果某種技術是你做好基本程式設計工作所需要的,那麼本書就會介紹它,同時展示用以支援這種技術的程式設計思想和語言工具,并提供相應的練習,期望你通過做這些練習來熟悉這種技術。但如果你隻想了解“玩具程式”,那麼你能學到的将遠比我所提供的少得多。另一方面,我不會用一些實用性很低的内容來浪費你的時間,本書介紹的内容都是你在實踐中幾乎肯定會用到的。
如果你隻是希望直接使用别人編寫的程式,而不想了解其内部原理,也不想親自向代碼中加入重要的内容,那麼本書不适合你,采用另一本書或另一種程式設計語言會更好些。如果這大概就是你對程式設計的看法,那麼請同時考慮一下你從何得來的這種觀點,它真的滿足你的需求嗎?人們常常低估程式設計的複雜程度和它的重要性。我不願看到,你不喜歡程式設計是因為你的需求與我所描述的軟體世界之間不比對而造成的。資訊技術世界中有很多地方是不要求程式設計知識的。本書面向的是那些确實希望編寫和了解複雜計算機程式的人。
考慮到本書的結構和注重實踐的特點,它也可以作為學習程式設計的第二本書,适合那些已經了解一點c++的人,以及那些會用其他語言程式設計而現在想學習c++的人。如果你屬于其中一類,我不好估計你學習這本書要花費多長時間。但我可以給你的建議是,多做練習。因為你在學習中常見的一個問題是習慣用熟悉的、舊的方式編寫程式,而不是在适當的地方采用新技術,多做練習會幫助你克服這個問題。如果你曾經按某種更為傳統的方式學習過c++,那麼在進行到第7章之前,你會發現一些令你驚奇的、有用的内容。除非你的名字是stroustrup,否則你會發現我在本書中所讨論的内容不是“你父輩的c++”。
學習程式設計要靠程式設計實踐。在這一點上,程式設計與其他需要實踐學習的技藝是相似的。你不可能僅僅通過讀書就學會遊泳、演奏樂器或者開車,必須進行實踐。同樣,你也不可能不讀寫大量代碼就學會程式設計。本書給出了大量代碼執行個體,都配有說明文字和圖表。你需要通過讀這些代碼來了解程式設計的思想、概念和原理,并掌握用來表達這些思想、概念和原理的程式設計語言的特性。但有一點很重要,僅僅讀代碼是學不會程式設計實踐技巧的。為此,你必須進行程式設計練習,通過程式設計工具熟悉編寫、編譯和運作程式。你需要親身體驗程式設計中會出現的錯誤,學習如何修改它們。總之,在學習程式設計的過程中,編寫代碼的練習是不可替代的。而且,這也是樂趣所在!
另一方面,程式設計遠非遵循一些文法規則和閱讀手冊那麼簡單。本書的重點不在于c++的文法,而在于了解基礎思想、原理和技術,這是一名好程式員所必備的。隻有設計良好的代碼才有機會成為一個正确、可靠和易維護的系統的一部分。而且,“基礎”意味着延續性:當現在的程式設計語言和工具演變甚至被取代後,這些基礎知識仍會保持其重要性。
那麼計算機科學、軟體工程、資訊技術等又如何呢?它們都屬于程式設計範疇嗎?當然不是!但程式設計是一門基礎性的學科,是所有計算機相關領域的基礎,在計算機科學領域占有重要的地位。本書對算法、資料結構、使用者接口、資料處理和軟體工程等領域的重要概念和技術進行了簡要介紹,但本書不能替代對這些領域的全面、均衡的學習。
代碼可以很有用,同樣可以很優美。本書會幫你了解這一點,同時了解優美的代碼意味着什麼,并幫你掌握構造優美代碼的原理和實踐技巧。祝你學習程式設計順利!
緻學生
到目前為止,我在德州農工大學已經用本書教過幾千名大一新生,其中60%曾經有過程式設計經曆,而剩餘40%從未見過哪怕一行代碼。大多數學生的學習是成功的,是以你也可以成功。
你不一定是在某門課程中學習本書,本書也廣泛用于自學。然而,不管你學習本書是作為課程的一部分還是自學,都要盡量與他人協作。程式設計有一個不好的名聲——它是一種個人活動,這是不公正的。大多數人在作為一個有共同目标的團體的一份子時,工作效果更好,學習得更快。與朋友一起學習和讨論問題不是“作弊”,而是取得進步最有效同時也是最快樂的途徑。如果沒有特殊情況的話,與朋友一起工作會促使你表達出自己的思想,這正是測試你對問題了解和确認你的記憶的最有效方法。你沒有必要獨自解決所有程式設計語言和程式設計環境上的難題。但是,請不要自欺欺人——不去完成那些簡單練習和大量的習題(即使沒有老師督促你,你也不應這樣做)。記住:程式設計(尤其)是一種實踐技能,需要通過實踐來掌握。如果你不編寫代碼(完成每章的若幹習題),那麼閱讀本書就純粹是一種無意義的理論學習。
大多數學生,特别是那些愛思考的好學生,有時會對自己努力工作是否值得産生疑問。當你産生這樣的疑問時,休息一會兒,重新讀一下前言,讀一下第1章和第22章。在那裡,我試圖闡述我在程式設計中發現了哪些令人興奮的東西,以及為什麼我認為程式設計是能為世界帶來積極貢獻的重要工具。如果你對我的教學哲學和一般方法有疑問,請閱讀引言。
你可能會對本書的厚度感到擔心。本書如此之厚的一部分原因是,我甯願反複重複一些解釋說明或增加一些執行個體,而不是讓你自己到處找這些内容,這應該令你安心。另外一個主要原因是,本書的後半部分是一些參考資料和補充資料,供你想要深入了解程式設計的某個特定領域(如嵌入式系統程式設計、文本分析或數值計算)時查閱。
還有,學習中請耐心些。學習任何一種重要的、有價值的新技能都要花費一些時間,而這是值得的。
緻教師
本書不是傳統的計算機科學導論書籍,而是一本關于如何構造能實際工作的軟體的書。是以本書省略了很多計算機科學系學生按慣例要學習的内容(圖靈完全、狀态機、離散數學、喬姆斯基文法等)。硬體相關的内容也省略了,因為我假定學生從幼稚園開始就已經通過不同途徑使用過計算機了。本書也不準備涉及一些計算機科學領域最重要的主題。本書是關于程式設計的(或者更一般地說,是關于如何開發軟體的),是以關注的是少量主題的更深入的細節,而不是像傳統計算機課程那樣讨論很多主題。本書隻試圖做好一件事,而且計算機科學也不是一門課程可以囊括的。如果本書被計算機科學、計算機工程、電子工程(我們最早的很多學生都是電子工程專業的)、資訊科學或者其他相關專業所采用,我希望這門課程能和其他一些課程一起進行,共同形成對計算機科學的完整介紹。
請閱讀引言,那裡有對我的教學哲學、一般方法等的介紹。請在教學過程中嘗試将這些觀點傳達給你的學生。
iso标準c++
c++由一個iso标準定義。第一個iso c++标準于1998年獲得準許,是以那個版本的c++被稱為c++98。寫本書第1版時,我正從事c++11的設計工作。最令人沮喪的是,當時我還不能使用一些新語言特性(如統一初始化、範圍for循環、move語義、lambda表達式、concept等)來簡化原理和技術的展示。不過,由于設計該書時考慮到了c++11,是以很容易在合适的地方添加這些特性。在寫作本版時,c++标準是2011年準許的c++11,2014 iso标準c++14中的一些特性正在進入主流的c++實作中。本書中使用的語言标準是c++11,并涉及少量的c++14特性。例如,如果你的編譯器不能編譯下面的代碼:
可用如下代碼替代:
若你的編譯器不支援c++11,請換一個新的編譯器。好的、現代的c++編譯器可從多處下載下傳,見www.stroustrup.com/compilers.html。使用較早且缺少支援的語言版本會引入不必要的困難。
資源
本書支援網站的網址為www.stroustrup.com/programming,其中包含了各種使用本書講授和學習程式設計所需的輔助資料。這些資料可能會随着時間的推移不斷改進,但對于初學者,現在可以找到這些資料:
基于本書的講義幻燈片;
一本教師指南;
本書中使用的庫的頭檔案和實作;
本書中執行個體的代碼;
某些習題的解答;
可能會有用處的一些連結;
勘誤表。
歡迎随時提出對這些資料的改進意見。
緻謝
我要特别感謝已故的同僚和聯合導師lawrence“pete”petersen,很久以前,在我還未感受到教授初學者的惬意時,是他鼓勵我承擔這項工作,并向我傳授了很多能令課程成功的教學經驗。沒有他,這門課程的首次嘗試就會失敗。他參與了這門課程最初的建設,本書就是為這門課程所著。他還和我一起反複講授這門課程,汲取經驗,不斷改進課程和本書。在本書中我使用的“我們”這個字眼,最初的意思就是指“我和pete”。
我要感謝那些直接或間接幫助過我撰寫本書的學生、助教和德州農工大學講授engr 112、113及csce 121課程的教師,以及walter daugherity、hyunyoung lee、teresa leyk、ronnie ward、jennifer welch,他們也講授過這門課程。還要感謝damian dechev、tracy hammond、arne tolstrup madsen、gabriel dos reis、nicholas stroustrup、j. c. van winkel、greg versoonder、ronnie ward和leor zolman對本書初稿提出的建設性意見。感謝mogens hansen為我解釋引擎控制軟體。感謝al aho、stephen edwards、brian kernighan和daisy nguyen幫助我在夏天躲開那些分心的事,完成本書。
感謝art werschulz,他在紐約福特漢姆大學的課程中使用了本書第1版,并據此提出了很多建設性的意見。還要感謝nick maclaren,他在劍橋大學使用了本書的第1版,并對本書的習題提出了非常詳盡的建議。他的學生在知識背景和專業需求上與德州農工大學大一學生有巨大的差異。
感謝addison-wesley公司為我安排的審閱者richard enbody、david gustafson、ron mccarty和k. narayanaswamy,他們基于自身講授c++課程或大學計算機科學導論課程的經驗,對本書提出了寶貴的意見。還要感謝我的編輯peter gordon為本書提出的很多有價值的意見以及極大的耐心。我非常感謝addison-wesley公司的制作團隊,他們為本書的高品質出版做出了很多貢獻,他們是:linda begley(校對),kim arney(排版),rob mauhar(插圖),julie nahil(制作編輯),barbara wood(文字編輯)。
感謝本書第1版的譯者,他們發現并幫助澄清了很多問題。特别是,lo?c joly和michel michaud在法語翻譯版中做了全面的技術檢查,修改了很多問題。
我還要感謝brian kernighan和doug mcilroy為撰寫程式設計類書籍定下了一個非常高的标杆,以及dennis ritchie和kristen nygaard為實用程式設計語言設計提供的非常有價值的經驗。
引 言
當實際地形與地圖不符時,相信實際地形。
——瑞士軍隊諺語
講授和學習本書的方法
我們是如何幫助你學習的?又是如何安排學習程序的?我們的做法是,盡力為你提供編寫高效的實用程式所需的最基本的概念、技術和工具,包括程式組織、調試和測試、類設計、計算、函數和算法設計、繪圖方法(僅介紹二維圖形)、圖形使用者界面(gui)、文本處理、正規表達式比對、檔案和流輸入輸出(i/o)、記憶體管理、科學/數值/工程計算、設計和程式設計思想、c++标準庫、軟體開發政策、c語言程式設計技術。認真完成這些内容的學習,我們會學到如下程式設計技術:過程式程式設計(c語言程式設計風格)、資料抽象、面向對象程式設計和泛型程式設計。本書的主題是程式設計,也就是表達代碼意圖所需的思想、技術和工具。c++語言是我們的主要工具,是以我們比較詳細地描述了很多c++語言的特性。但請記住,c++隻是一種工具,而不是本書的主題。本書是“用c++語言進行程式設計”,而不是“c++和一點程式設計理論”。
我們介紹的每個主題都至少出于兩個目的:提出一種技術、概念或原理,介紹一個實用的語言特性或庫特性。例如,我們用一個二維圖形繪制系統的接口展示如何使用類和繼承。這使我們節省了篇幅(也節省了你的時間),并且還強調了程式設計不隻是簡單地将代碼拼裝起來以盡快地得到一個結果。c++标準庫是這種“雙重作用”例子的主要來源,其中很多主題甚至具有三重作用。例如,我們會介紹标準庫中的向量類vector,用它來展示一些廣泛使用的設計技術,并展示很多用來實作vector的程式設計技術。我們的一個目标是向你展示一些主要的标準庫功能是如何實作的,以及它們如何與硬體相配合。我們堅持認為一個工匠必須了解他的工具,而不是僅僅把工具當作“有魔力的東西”。
對于一個程式員來說,總是會對某些主題比對其他主題更感興趣。但是,我們建議你不要預先判斷你需要什麼(你怎麼知道你将來會需要什麼呢?),至少每一章都要浏覽一下。如果你學習本書是作為一門課程的一部分,你的老師會指導你如何選擇學習内容。
我們的教學方法可以描述為“深度優先”,同時也是“具體優先”和“基于概念”。首先,我們快速地(好吧,是相對快速地,從第1章到第11章)将一些編寫小的實用程式所需的技巧提供給你。在這期間,我們還簡明扼要地提出很多工具和技術。我們着重于簡單具體的代碼執行個體,因為相對于抽象概念,人們能更快領會具體執行個體,這就是多數人的學習方法。在最初階段,你不應期望了解每個小的細節。特别是,你會發現對剛剛還工作得好好的程式稍加改動,便會呈現出“神秘”的效果。盡管如此,你還是要嘗試一下!還有,請完成我們提供的簡單練習和習題。請記住,在學習初期你隻是沒有掌握足夠的概念和技巧來準确判斷什麼是簡單的,什麼是複雜的。請等待一些驚奇的事情發生,并從中學習吧。
我們會快速通過這樣一個初始階段——我們想盡可能快地帶你進入編寫有趣程式的階段。有些人可能會質疑,“我們的進展應該慢些、謹慎些,我們應該先學會走,再學跑!”但是你見過小孩學習走路嗎?實際上小孩在學會平穩地慢慢走路之前就開始嘗試跑了。與之相似,你可以先勇猛向前,偶爾摔一跤,從中獲得程式設計的感覺,然後再慢下來,獲得必要的精确控制能力和準确的了解。你必須在學會走之前就開始跑!
你不要投入大量精力試圖學習一些語言或技術細節的所有相關内容。例如,你可以熟記所有c++的内置類型及其使用規則。你當然可以這麼做,而且這麼做會使你覺得自己很博學。但是,這不會使你成為一名程式員。如果你學習中略過一些細節,将來可能偶爾會因為缺少相關知識而被“灼傷”,但這是擷取編寫好程式所需的完整知識結構的最快途徑。注意,我們的這種方法本質上就是小孩學習其母語的方法,也是教授外語的最有效方法。有時你不可避免地被難題困住,我們鼓勵你向授課老師、朋友、同僚、指導教師等尋求幫助。請放心,在前面這些章節中,所有内容本質上都不困難。但是,很多内容是你所不熟悉的,是以最初可能會感覺有點難。
随後,我們介紹一些入門技巧來拓寬你的知識。我們通過執行個體和習題來強化你的了解,為你提供一個程式設計的概念基礎。
我們非常強調思想和原理。思想能指導你求解實際問題——可以幫助你知道在什麼情況下問題求解方案是好的、合理的。你還應該了解這些思想背後的原理,進而了解為什麼要接受這些思想,為什麼遵循這些思想會對你和使用你的代碼的使用者有幫助。沒有人會滿意“因為事情就是如此”這樣的解釋。更為重要的是,如果真正了解了思想和原理,你就能将自己已知的知識推廣到新的情況;就能用新的方法将思想和工具結合來解決新的問題。知其是以然是學會程式設計技巧所必需的。相反,僅僅不求甚解地記住大量規則和語言特性有很大局限,是錯誤之源,是在浪費時間。我們認為你的時間很珍貴,盡量不要浪費它。
我們把很多c++語言層面的技術細節放在了附錄和手冊中,你可以随時按需查找。我們假定你有能力查找到需要的資訊,你可以借助目錄來查找資訊。不要忘了編譯器和網際網路的線上功能。但要記住,要對所有網際網路資源保持足夠的懷疑,直至你有足夠的理由相信它們。因為很多看起來很權威的網站實際上是由程式設計新手或者想要出售什麼東西的人建立的。而另外一些網站,其内容都是過時的。我們在支援網站www.stroustrup.com/programming上列出了一些有用的網站連結和資訊。
請不要過于急切地期盼“實際的”例子。我們理想的執行個體都是能直接說明一種語言特性、一個概念或者一種技術的簡短代碼。很多現實世界中的執行個體比我們給出的執行個體要淩亂很多,而且所能展示的知識也不比我們的執行個體更多。包含數十萬行代碼的成功商業程式中所采用的技術,我們用幾個50行規模的程式就能展示出來。了解現實世界程式的最快途徑是好好研究一些基礎的小程式。
另一方面,我們不會用“聰明可愛的風格”來闡述我們的觀點。我們假定你的目标是編寫供他人使用的實用程式,是以書中給出的執行個體要麼是用來說明語言特性,要麼是從實際應用中提取出來的。我們的叙述風格都是用專業人員對(将來的)專業人員的那種口氣。
一般方法
本書的内容組織适合從頭到尾一章一章地閱讀,當然,你也常常要回過頭來對某些内容讀上第二遍、第三遍。實際上,這是一種明智的方法,因為當遇到還看不出什麼門道的地方時,你通常會快速掠過。對于這種情況,你最終還是會再次回到這個地方。然而,這麼做要适度,因為除了交叉引用之外,對本書其他部分,你随便翻開一頁,就從那裡開始學習,并希望成功,是不可能的。本書每一節、每一章的内容安排,都假定你已經了解了之前的内容。
本書的每一章都是一個合理的自包含單元,這意味着應一口氣讀完(當然這隻是理論上,實際上由于學生緊密的學習計劃,不總是可行)。這是将内容劃分為章的主要标準。其他标準包括:從簡單練習和習題的角度,每章是一個合适的單元;每一章提出一些特定的概念、思想或技術。這種标準的多樣性使得少數章過長,是以不要教條地遵循“一口氣讀完”的準則。特别是當你已經考慮了思考題,做了簡單練習,并做了一些習題時,你通常會發現你需要回過頭去重讀一些小節和幾天前讀過的内容。
“它回答了我想到的所有問題”是對一本教材常見的稱贊,這對細節技術問題是很理想的,而早期的讀者也發現本書有這樣的特性。但是,這不是全部的理想,我們希望提出初學者可能想不到的問題。我們的目标是,回答那些你在編寫供他人使用的高品質軟體時需要考慮的問題。學習回答好的(通常也是困難的)問題是學習如何像一個程式員那樣思考所必需的。隻回答那些簡單的、淺顯的問題會使你感覺良好,但無助于你成長為一名程式員。
我們努力尊重你的智力,珍惜你的時間。在本書中,我們以專業性而不是精明伶俐為目标,甯可有節制地表達一個觀點而不大肆渲染它。我們盡力不誇大一種程式設計技術或一個語言特性的重要性,但請不要是以低估“這通常是有用的”這種簡單陳述的重要程度。如果我們平靜地強調某些内容是重要的,意思是你如果不掌握它,或早或晚都會是以而浪費時間。
我們不會僞稱本書中的思想和工具是完美的。實際上沒有任何一種工具、庫、語言或者技術能夠解決程式員所面臨的所有難題,至多能幫助你開發、表達你的問題求解方案而已。我們盡量避免“無害的謊言”,也就是說,我們會盡力避免過于簡單的解釋,雖然這些解釋清晰且易了解,但在實際程式設計和問題求解時卻容易弄錯。另一方面,本書不是一本參考手冊,如果需要c++詳細完整的描述,請參考bjarne stroustrup的《the c++ programming language》第4版(addison-wesley出版社,2013年)和iso的c++标準。
簡單練習和習題等
程式設計不僅僅是一種腦力活動,實際動手編寫程式是掌握程式設計技巧必不可少的一環。本書提供兩個層次的程式設計練習:
簡單練習:簡單練習是一種非常簡單的習題,其目的是幫助學生掌握一些相對死闆的實際程式設計技巧。一個簡單練習通常由一系列的單個程式修改練習組成。你應該完成所有簡單練習。完成簡單練習不需要很強的了解能力、很聰明或者很有創造性。簡單練習是本書的基本組成部分,如果你沒有完成簡單練習,就不能說完成了本書的學習。
習題:有些習題比較簡單,有些則很難,但多數習題都是想給學生留下一定的創造和想象空間。如果時間緊張,你可以做少量習題,但題量至少應該能使你弄清楚哪些内容對你來說比較困難,在此基礎上應該再多做一些,這是你的成功之道。我們希望本書的習題都是學生能夠做出來的,而不是需要超乎常人的智力才能解答的複雜難題。但是,我們還是期望本書習題能給你足夠多的挑戰,能用光甚至是最好的學生的所有時間。我們不期待你能完成所有習題,但請盡情嘗試。
另外,我們建議每個學生都能參與到一個小的項目中去(如果時間允許,能參與更多項目當然就更好了)。一個項目的目的就是要編寫一個完整的有用程式。理想情況下,一個項目由一個多人小組(比如三個人)共同完成。大多數人會發現做項目非常有趣,并在這個過程中學會如何把很多事情組織在一起。
一些人喜歡在讀完一章之前就把書扔到一邊,開始嘗試做一些執行個體程式;另一些人則喜歡把一章讀完後,再開始編碼。為了幫助前一種讀者,我們用“試一試”闆塊給出了對于程式設計實踐的一些簡單建議。一個“試一試”通常來說就是一個簡單練習,而且隻着眼于前面剛剛介紹的主題。如果你略過了一個“試一試”而沒有去嘗試它,那麼最好在做這一章的簡單練習時做一下這個題目。“試一試”要麼是該章簡單練習的補充,要麼幹脆就是其中的一部分。
在每章末尾你都會看到一些思考題,我們設定這些思考題是想為你指出這一章中的重點内容。一種學習思考題的方法是把它們作為習題的補充:習題關注程式設計的實踐層面,而思考題則試圖幫你強化思想和概念。是以,思考題有點像面試題。
每章最後都有“術語”一節,給出本章中提出的程式設計或c++方面的基本詞彙表。如果你希望了解别人關于程式設計的陳述,或者想明确表達出自己的思想,就應該首先弄清術語表中每個術語的含義。
重複是學習的有效手段,我們希望每個重要的知識點都在書中至少出現兩次,并通過習題再次強調。
進階學習
當你完成本書的學習時,是否能成為一名程式設計和c++方面的專家呢?答案當然是否定的!如果做得好的話,程式設計會是一門建立在多種專業技能上的精妙的、深刻的、需要高度技巧的藝術。你不能期望花四個月時間就成為一名程式設計專家,這與其他學科一樣:你不能期望花四個月、半年或一年時間就成為一名生物學專家、一名數學家、一名自然語言(如中文、英文或丹麥文)方面的專家,或是一名小提琴演奏家。但如果你認真地學完了這本書,你可以期待也應該期待的是:你已經在程式設計領域有了一個很好的開始,已經可以寫相對簡單的、有用的程式,能讀更複雜的程式,而且已經為進一步的學習打下了良好的理論和實踐基礎。
學習完這門入門課程後,進一步學習的最好方法是開發一個真正能被别人使用的程式。在完成這個項目之後或者同時(同時可能更好)學習一本專業水準的教材(如stroustrup的《the c++ programming language》),學習一本與你做的項目相關的更專門的書(比如,你如果在做gui相關項目的話,可選擇關于qt的書,如果在做分布式程式的話,可選擇關于ace的書),或者學習一本專注于c++某個特定方面的書(如koenig和moo的《accel-erated c++》、sutter的《exceptional c++》或gamma等人的《design patterns》)。完整的參考書目參見本引言或本書最後的參考文獻。
最後,你應該學習另一門程式設計語言。我們認為,如果隻懂一門語言,你是不可能成為軟體領域的專家的(即使你并不是想做一名程式員)。
本書内容順序的安排
講授程式設計有很多方法。很明顯,我們不贊同“我學習程式設計的方法就是最好的學習方法”這種流行的看法。為了友善學習,我們較早地提出一些僅僅幾年前還是先進技術的内容。我們的設想是,本書内容的順序完全由你學習程式設計過程中遇到的問題來決定,随着你對程式設計的了解和實際動手能力的提高,一個主題一個主題地平滑向前推進。本書的叙述順序更像一部小說,而不是一部字典或者一種階層化的順序。
一次性地學習所有程式設計原理、技術和語言功能是不可能的。是以,你需要選擇其中一個子集作為起點。更一般地,一本教材或一門課程應該通過一系列的主題子集來引導學生。我們認為,選擇适當的主題并給出重點是我們的責任。我們不能簡單地羅列出所有内容,必須做出取舍;在每個學習階段,我們選擇省略的内容與選擇保留的内容至少同樣重要。
作為對照,這裡列出我們決定不采用的教學方法(僅僅是一個縮略清單),對你可能有用:
c優先:用這種方法學習c++完全是浪費學生的時間,學生能用來求解問題的語言功能、技術和庫比所需的要少得多,這樣的程式設計實踐很糟糕。與c相比,c++能提供更強的類型檢查、對新手來說更好的标準庫以及用于錯誤處理的異常機制。
自底向上:學生本該學習好的、有效的程式設計技巧,但這種方法分散了學生的注意力。學生在求解問題過程中所能依靠的程式設計語言和庫方面的支援明顯不足,這樣的程式設計實踐品質很低、毫無用處。
如果你介紹某些内容,就必須介紹它的全部:這實際上意味着自底向上方法(一頭紮進涉及的每個主題,越陷越深)。這種方法硬塞給初學者很多他們并不感興趣而且可能很長時間内都用不上的技術細節,令他們厭煩。這樣做毫無必要,因為一旦學會了程式設計,你完全可以自己到手冊中查找技術細節。這是手冊擅長的方面,如果用來學習基本概念就太可怕了。
自頂向下:這種方法對一個主題從基本原理到細節逐漸介紹,傾向于把讀者的注意力從程式設計的實踐層面上轉移開,迫使讀者一直專注于上層概念,而沒有任何機會實際體會這些概念的重要性。這是錯誤的,例如,如果你沒有實際體會到編寫程式是那麼容易出錯,而修正一個錯誤是那麼困難,你就無法體會到正确的軟體開發原理。
抽象優先:這種方法專注于一般原理,保護學生不受讨厭的現實問題限制條件的困擾,這會導緻學生輕視實際問題、語言、工具和硬體限制。通常,這種方法基于“教學用語言”——一種将來不可能實際應用,有意将學生與實際的硬體和系統問題隔絕開的語言。
軟體工程理論優先:這種方法和抽象優先的方法具有與自頂向下方法一樣的缺點:沒有具體執行個體和實踐體驗,你無法體會到抽象理論的價值和正确的軟體開發實踐技巧。
面向對象先行:面向對象程式設計是一種組織代碼和開發工作的很好方法,但并不是唯一有效的方法。特别是,以我們的體會,在類型系統和算法式程式設計方面打下良好的基礎,是學習類和類層次設計的前提條件。本書确實在一開始就使用了使用者自定義類型(一些人稱之為“對象”),但我們直到第6章才展示如何設計一個類,而直到第17章才展示了類層次。
相信魔法:這種方法隻是向初學者展示強有力的工具和技術,而不介紹其下蘊含的技術和特性。這讓學生隻能去猜這些工具和技術為什麼會有這樣的表現,使用它們會付出多大代價,以及它們恰當的應用範圍,而通常學生會猜錯!這會導緻學生過分刻闆地遵循相似的工作模式,成為進一步學習的障礙。
自然,我們不會斷言這些我們沒有采用的方法毫無用處。實際上,在介紹一些特定的内容時,我們使用了其中一些方法,學生能體會到這些方法在這些特殊情況下的優點。但是,當學習程式設計是以實用為目标時,我們不把這些方法作為一般的教學方法,而是采用其他方法:主要是具體優先和深度優先方法,并對重點概念和技術加以強調。
程式設計和程式設計語言
我們首先介紹程式設計,把程式設計語言放在第二位。我們介紹的程式設計方法适用于任何通用的程式設計語言。我們的首要目的是幫助你學習一般概念、理論和技術,但是這些内容不能孤立地學習。例如,不同程式設計語言在文法細節、程式設計思想的表達以及工具等方面各不相同。但對于編寫無錯代碼的很多基本技術,如編寫邏輯簡單的代碼(第5章和第6章),構造不變式(9.4.3節),以及接口和實作細節分離(9.7節和19.1~19.2節)等,不同程式設計語言則差别很小。
程式設計技術的學習必須借助于一門程式設計語言,代碼設計、組織和調試等技巧是不可能從抽象理論中學到的。你必須用某種程式設計語言編寫代碼,從中擷取實踐經驗。這意味着你必須學習一門程式設計語言的基本知識。這裡說“基本知識”,是因為花幾個星期就能掌握一門主流實用程式設計語言全部内容的日子已經一去不複返了。本書中c++語言相關的内容隻是我們選出的它的一個子集,是與編寫高品質代碼關系最緊密的那部分内容。而且,我們所介紹的c++特性都是你肯定會用到的,因為這些特性要麼是出于邏輯完整性的要求,要麼是c++社群中最常見的。
可移植性
編寫運作于多種平台的c++程式是很常見的情況。一些重要的c++應用甚至運作于我們聞所未聞的平台!我們認為可移植性和對多種平台架構/作業系統的利用是非常重要的特性。本質上,本書的每個例子都不僅是iso标準c++程式,還是可移植的。除非特别指出,本書的代碼都能運作于任何一種c++實作,并且确實已經在多種計算機平台和作業系統上測試通過了。
不同系統編譯、連結和運作c++程式的細節各不相同,如果每當提及一個實作問題時就介紹所有系統和所有編譯器的細節,是非常單調乏味的。我們在附錄b中給出了windows平台visual studio和microsoft c++入門的大部分基本知識。
如果你在使用任何一種流行的但相對複雜的ide(內建開發環境,integrated development environment)時遇到了困難,我們建議你嘗試指令行工作方式,它極其簡單。例如,下面給出的是在unix或linux平台用gnu c++編譯器編譯、連結和運作一個包含兩個源檔案my_f?ile1.cpp和my_f?ile2.cpp的簡單程式所需的全部指令:
是的,這真的就是全部。
提示标記
為了友善讀者回顧本書,以及幫讀者發現第一次閱讀時遺漏的關鍵内容,我們在頁邊空白處放置三種“提示标記”:
:概念和技術。
:建議。
:警告。
附言
很多章最後都提供了一個簡短的“附言”,試圖給出本章所介紹内容的全景描述。我們這樣做是因為意識到,知識可能是(而且通常就是)令人畏縮的,隻有當完成了習題、學習了進一步的章節(應用了本章中提出的思想)并進行了複習之後才能完全了解。不要恐慌,放輕松,這是很自然的,可以預料到的。你不可能一天之内就成為專家,但可以通過學習本書逐漸成為一名合格的程式員。學習過程中,你會遇到很多知識、執行個體和技術,很多程式員已經從中發現了令人激動的和有趣的東西。
程式設計和計算機科學
程式設計就是計算機科學的全部嗎?答案當然是否定的!我們提出這一問題的唯一原因就是确實曾有人将其混淆。本書會簡單涉及計算機科學的一些主題,如算法和資料結構,但我們的目标還是講授程式設計:設計和實作程式。這比廣泛接受的計算機科學的概念更寬,但也更窄:
更寬,因為程式包含很多專業技巧,通常不能歸類于任何一種科學。
更窄,因為就涉及的計算機科學的内容而言,我們沒有系統地給出其基礎。
本書的目标是作為一門計算機科學課程的一部分(如果成為一個計算機科學家是你的目标的話),成為軟體構造和維護領域第一門課程的基礎(如果你希望成為一個程式員或者軟體工程師的話),總之是更大的完整系統的一部分。
本書自始至終都依賴計算機科學,我們也強調基本原理,但我們是以理論和經驗為基礎來講授程式設計,是把它作為一種實踐技能,而不是一門科學。
創造性和問題求解
本書的首要目标是幫助你學會用代碼表達自己的思想,而不是教你如何獲得這些思想。沿着這樣一個思路,我們給出很多執行個體,展示如何求解問題。每個執行個體通常先分析問題,随後對求解方案逐漸求精。我們認為程式設計本身是問題求解的一種描述形式:隻有完全了解了一個問題及其求解方案,你才能用程式來正确表達它;而隻有通過構造和測試一個程式,你才能确定你對問題和求解方案的了解是完整、正确的。是以,程式設計本質上是了解問題和求解方案工作的一部分。但是,我們的目标是通過執行個體而不是通過“布道”或是問題求解詳細“處方”的展示來說明這一切。
回報方法
我們不認為存在完美的教材;個人的需求總是差别很大的。但是,我們願意盡力使本書和支援材料更接近完美。為此,我們需要大家的回報,脫離讀者是不可能寫出好教材的。請大家給我們發送回報報告,包括内容錯誤、排版錯誤、含混的文字、缺失的解釋等。我們也感謝有關更好的習題、更好的執行個體、增加内容、删除内容等的建議。大家提出的建設性意見會幫助将來的讀者,我們會将勘誤表張貼在支援網站:www.stroustrup.com/programming。
參考文獻
下面列出了前面提及的參考文獻,以及可能對你有用的一些文獻。
becker, pete, ed. the c++ standard. iso/iec 14882:2011.
blanchette, jasmin, and mark summerf?ield. c++ gui programming with qt 4, second edition. prentice hall, 2008. isbn 0132354160.
koenig, andrew, and barbara e. moo. accelerated c++: practical programming by example. addison-wesley, 2000. isbn 020170353x.
meyers, scott. effective c++: 55 specif?ic ways to improve your programs and designs, third edition. addison-wesley, 2005. isbn 0321334876.
schmidt, douglas c., and stephen d. huston. c++ network programming, volume 1: mastering complexity with ace and patterns. addison-wesley, 2001. isbn 0201604647.
schmidt, douglas c., and stephen d. huston. c++ network programming, volume 2: systematic reuse with ace and frameworks. addison-wesley, 2002. isbn 0201795256.
stroustrup, bjarne. the design and evolution of c++. addison-wesley, 1994. isbn 0201543303.
stroustrup, bjarne. “learning standard c++ as a new language.” c/c++ users journal, may 1999.
stroustrup, bjarne. the c++ programming language, fourth edition. addison-wesley, 2013. isbn 0321563840.
stroustrup, bjarne. a tour of c++. addison-wesley, 2013. isbn 0321958314.
sutter, herb. exceptional c++: 47 engineering puzzles, programming problems, and solutions. addison-wesley, 1999. isbn 0201615622.
更全面的參考文獻清單可以在本書最後找到。
作者簡介
你也許有理由問:“是一些什麼人想要教我程式設計?”那麼,下面給出作者的一些生平資訊。bjarne stroustrup和lawrence“pete”petersen合著了本書。stroustrup還設計并講授了面向大學一年級學生的課程,這門課程是與本書同步發展起來的,以本書的初稿作為教材。
bjarne stroustrup
我是c++語言的設計者和最初的實作者。在過去大約40年間,我使用c++和許多其他程式設計語言進行過各種各樣的程式設計工作。我喜歡那些用在富有挑戰性的應用(如機器人控制、繪圖、遊戲、文本分析以及網絡應用)中的優美而又高效的代碼。我教過能力和興趣各異的人設計、程式設計和c++語言。我是iso标準組織c++委員會的建立者,現在是該委員會語言演化工作組的主席。
這是我第一本入門性的書。我編著的其他書籍如《the c++ pro-gramming language》和《the design and evolution of c++》都是面向有經驗的程式員的。
我生于丹麥奧爾胡斯一個藍領(勞工階級)家庭,在家鄉的大學獲得了數學與計算機科學碩士學位。我的計算機科學博士學位是在英國劍橋大學獲得的。我為at&t工作了大約25年,最初在著名的貝爾實驗室的計算機科學研究中心——unix、c、c++及其他很多東西的發明地,後來在at&t實驗室研究中心。
我現在是美國國家工程院的院士,acm會士(fellow)和ieee會士。我獲得了2005年度sigma xi(科學研究協會)的科學成就william procter獎,我是首位獲得此獎的計算機科學家。2010年,我獲得了丹麥奧爾胡斯大學最古老也最富聲望的獎項rigmor og carl holst-knudsens videnskapspris,該獎項頒發給為科學做出貢獻的與該校有關的人士。2013年,我被位于俄羅斯聖彼得堡的資訊技術、力學和光學(itmo)國立研究大學授予計算機科學榮譽博士學位。
至于工作之外的生活,我已婚,有兩個孩子,一個是醫學博士,另一個在進行博士後研究。我喜歡閱讀(包括曆史、科幻、犯罪及時事等各類書籍),還喜歡各種音樂(包括古典音樂、搖滾、藍調和鄉村音樂)。和朋友一起享受美食是我生活中必不可少的一部分,我還喜歡參觀世界各地有趣的地方。為了能夠享受美食,我還堅持跑步。
關于我的更多資訊,請見我的網站www.stroustrup.com。特别是,你可以在那裡找到我名字的正确發音。
lawrence“pete”petersen
2006年年末,pete如此介紹他自己:“我是一名教師。近20年來,我一直在德州農工大學講授程式設計語言。我已5次被學生選為優秀教師,并于1996年被工程學院的校友會選為傑出教師。我是wakonse優秀教師計劃的委員和教師發展研究院院士。
作為一名陸軍軍官的兒子,我的童年是在不斷遷移中度過的。在華盛頓大學獲得哲學學位後,我作為野戰炮兵官員和操作測試研究分析員在軍隊服役了22年。1971年至1973年期間,我在俄克拉荷馬希爾堡講授野戰炮兵軍官的進階課程。1979年,我幫助建立了測試軍官的訓練課程,并在1978年至1981年及1985年至1989年期間在跨越美國的九個不同地方以首席教官的身份講授這門課程。
1991年我組建了一個小型的軟體公司,生産供大學院系使用的管理軟體,直至1999年。我的興趣在于講授、設計和實作供人們使用的實用軟體。我在喬治亞理工大學獲得了工業管理學碩士學位,在德州農工大學獲得了教育管理學碩士學位。我還從nts獲得了微型計算機碩士學位。我在德州農工大學獲得了資訊與營運管理學博士學位。
我和我的妻子barbara都生于德州的布萊恩。我們喜歡旅行、園藝和招待朋友;我們花盡可能多的時間陪我們的兒子和他們的家庭,特别是我們的孫子和孫女angelina、carlos、tess、avery、nicholas和jordan。”
令人悲傷的是,pete于2007年死于肺癌。如果沒有他,這門課程絕對不會取得成功。
目 錄
第15章 容器和疊代器
<a href="https://yq.aliyun.com/articles/83712/" target="_blank">15.2 stl理念 </a>
<a href="https://yq.aliyun.com/articles/83723/" target="_blank">15.4 連結清單 </a>
<a href="https://yq.aliyun.com/articles/83744/" target="_blank">15.7 vector、list和string </a>
簡單練習
思考題
術語
習題
附言
第16章 算法和映射
<a href="https://yq.aliyun.com/articles/83749/" target="_blank">16.1 标準庫算法 </a>
<a href="https://yq.aliyun.com/articles/83752/" target="_blank">16.4 函數對象 </a>
術語
習題
第17章 一個顯示模型
<a href="https://yq.aliyun.com/articles/84446/" target="_blank">17.1 為什麼要使用圖形 </a>
<a href="https://yq.aliyun.com/articles/84456/" target="_blank">17.5 坐标系 </a>
<a href="https://yq.aliyun.com/articles/84461/" target="_blank">17.6 shape </a>
第18章 圖形類 85
18.1 圖形類概覽 85
18.2 point和line 87
18.3 lines 88
18.4 color 91
18.5 line_style 93
18.6 open_polyline 95
18.7 closed_polyline 96
18.8 polygon 97
18.9 rectangle 99
18.10 管理未命名對象 102
18.11 text 104
18.12 circle 105
18.13 ellipse 107
18.14 marked_polyline 108
18.15 marks 110
18.16 mark 111
18.17 image 112
簡單練習 114
思考題 115
術語 115
習題 116
附言 116
第19章 設計圖形類 117
19.1 設計原則 117
19.1.1 類型 117
19.1.2 操作 118
19.1.3 命名 119
19.1.4 可變性 120
19.2 shape 121
19.2.1 一個抽象類 122
19.2.2 通路控制 123
19.2.3 繪制形狀 125
19.2.4 拷貝和可變性 127
19.3 基類和派生類 128
19.3.1 對象布局 130
19.3.2 類的派生和虛函數的定義 131
19.3.3 覆寫 131
19.3.4 通路 133
19.3.5 純虛函數 134
19.4 面向對象程式設計的好處 135
簡單練習 136
思考題 136
術語 137
習題 137
附言 138
第20章 繪制函數圖和資料圖 139
20.1 簡介 139
20.2 繪制簡單函數圖 139
20.3 function 143
20.3.1 預設參數 143
20.3.2 更多例子 144
20.3.3 lambda表達式 146
20.4 axis 146
20.5 近似 148
20.6 繪制資料圖 152
20.6.1 讀取檔案 153
20.6.2 一般布局 154
20.6.3 資料比例 155
20.6.4 構造資料圖 156
簡單練習 158
思考題 159
術語 159
習題 159
附言 160
第21章 圖形使用者界面 161
21.1 使用者界面的選擇 161
21.2 “next”按鈕 162
21.3 一個簡單的視窗 163
21.3.1 回調函數 164
21.3.2 等待循環 166
21.3.3 lambda表達式作為回調函數 166
21.4 button和其他widget 167
21.4.1 widget 167
21.4.2 button 168
21.4.3 in_box和out_box 169
21.4.4 menu 170
21.5 一個執行個體 170
21.6 控制流反轉 173
21.7 添加菜單 174
21.8 調試gui代碼 178
簡單練習 179
思考題 179
術語 180
習題 180
附言 181
第22章 理念和曆史 182
22.1 曆史、理念和專業水準 182
22.1.1 程式設計語言的目标和哲學 182
22.1.2 程式設計理念 183
22.1.3 風格/範型 188
22.2 程式設計語言曆史概覽 190
22.2.1 最早的程式設計語言 191
22.2.2 現代程式設計語言的起源 193
22.2.3 algol家族 197
22.2.4 simula 203
22.2.5 c 204
22.2.6 c++ 207
22.2.7 今天 209
22.2.8 參考資料 210
思考題 211
術語 212
習題 212
附言 213
第23章 文本處理 214
23.1 文本 214
23.2 字元串 214
23.3 i/o流 217
23.4 映射 218
23.4.1 實作細節 222
23.5 一個問題 224
23.6 正規表達式的思想 225
23.6.1 原始字元串常量 227
23.7 用正規表達式進行搜尋 228
23.8 正規表達式文法 229
23.8.1 字元和特殊字元 230
23.8.2 字元集 230
23.8.3 重複 231
23.8.4 子模式 232
23.8.5 可選項 232
23.8.6 字元集和範圍 233
23.8.7 正規表達式錯誤 234
23.9 使用正規表達式進行模式比對 235
23.10 參考文獻 239
簡單練習 239
思考題 239
術語 240
習題 240
附言 241
第24章 數值計算 242
24.1 簡介 242
24.2 大小、精度和溢出 242
24.2.1 數值限制 245
24.3 數組 245
24.4 c風格的多元數組 246
24.5 matrix庫 247
24.5.1 矩陣的維和矩陣通路 248
24.5.2 一維矩陣 250
24.5.3 二維矩陣 252
24.5.4 矩陣i/o 253
24.5.5 三維矩陣 254
24.6 執行個體:求解線性方程組 255
24.6.1 經典的高斯消去法 256
24.6.2 選取主元 257
24.6.3 測試 257
24.7 随機數 258
24.8 标準數學函數 261
24.9 複數 262
24.10 參考文獻 263
簡單練習 264
思考題 264
術語 265
習題 265
附言 266
第25章 嵌入式系統程式設計 267
25.1 嵌入式系統 267
25.2 基本概念 269
25.2.1 可預測性 271
25.2.2 理想 272
25.2.3 生活在故障中 272
25.3 記憶體管理 274
25.3.1 動态記憶體配置設定存在的問題 274
25.3.2 動态記憶體配置設定的替代方法 276
25.3.3 存儲池執行個體 277
25.3.4 棧執行個體 278
25.4 位址、指針和數組 279
25.4.1 未經檢查的類型轉換 279
25.4.2 一個問題:不正常的接口 280
25.4.3 解決方案:接口類 282
25.4.4 繼承和容器 285
25.5 位、位元組和字 287
25.5.1 位和位運算 287
25.5.2 bitset 290
25.5.3 有符号數和無符号數 292
25.5.4 位運算 295
25.5.5 位域 296
25.5.6 執行個體:簡單加密 297
25.6 編碼規範 301
25.6.1 編碼規範應該是怎樣的 302
25.6.2 編碼原則執行個體 303
25.6.3 實際編碼規範 307
簡單練習 308
思考題 308
術語 310
習題 310
附言 311
第26章 測試 312
26.1 我們想要什麼 312
26.1.1 警告 313
26.2 程式正确性證明 313
26.3 測試 313
26.3.1 回歸測試 314
26.3.2 單元測試 315
26.3.3 算法和非算法 320
26.3.4 系統測試 325
26.3.5 尋找不成立的假設 326
26.4 測試方案設計 327
26.5 調試 328
26.6 性能 328
26.6.1 計時 329
26.7 參考文獻 331
簡單練習 331
思考題 331
術語 332
習題 332
附言 333
第27章 c語言 334
27.1 c和c++:兄弟 334
27.1.1 c/c++相容性 335
27.1.2 c不支援的c++特性 336
27.1.3 c标準庫 338
27.2 函數 338
27.2.1 不支援函數名重載 338
27.2.2 函數參數類型檢查 339
27.2.3 函數定義 340
27.2.4 c++調用c和c調用c++ 341
27.2.5 函數指針 343
27.3 小的語言差異 344
27.3.1 struct标簽名字空間 344
27.3.2 關鍵字 345
27.3.3 定義 345
27.3.4 c風格類型轉換 347
27.3.5 無類型指針的轉換 347
27.3.6 枚舉 348
27.3.7 名字空間 348
27.4 自由存儲空間 349
27.5 c風格字元串 350
27.5.1 c風格字元串和const 352
27.5.2 位元組操作 352
27.5.3 執行個體:strcpy() 353
27.5.4 一個風格問題 353
27.6 輸入/輸出:stdio 354
27.6.1 輸出 354
27.6.2 輸入 355
27.6.3 檔案 356
27.7 常量和宏 356
27.8 宏 357
27.8.1 類函數宏 358
27.8.2 文法宏 359
27.8.3 條件編譯 360
27.9 執行個體:侵入式容器 360
簡單練習 365
思考題 365
術語 366
習題 366
附言 367
附錄c 标準庫概要 368
附錄d 安裝fltk 410
附錄e gui實作 413
術語表 419
參考文獻 423