內(nèi)容簡(jiǎn)介
本書共18章9個(gè)附錄,在兼顧C++關(guān)鍵主題的同時(shí),注重編程思維的培養(yǎng)和練習(xí),兼顧邏輯和游戲,以豐富的圖表和其他結(jié)構(gòu)化方式直觀呈現(xiàn)出C++以及C++14的知識(shí)點(diǎn)和基礎(chǔ)概念。作者通過(guò)深入淺出、通俗易懂的語(yǔ)言,豐富的范例,清楚的解釋,大量的練習(xí),全方位討論了C++的關(guān)鍵主題,從一般的編程概念到技術(shù)到C++的具體特性。通過(guò)本書的閱讀,讀者可迅速掌握C++編程精髓。
本書破除了C++難學(xué)的迷思,適合讀者自學(xué),也是一本適合課堂教學(xué)的入門經(jīng)典。
譯者序
兩年里利用業(yè)余時(shí)間斷斷續(xù)續(xù)完成了本書翻譯(感謝編輯大人的耐心與寬容)。原因不是本書無(wú)趣,而是因?yàn)樘腥ぃg者的時(shí)間又不夠而已。真的是一本C++入門的好書。語(yǔ)言精煉且前后呼應(yīng)。你看到了一個(gè)不太理解的術(shù)語(yǔ)/概念,沒問(wèn)題,后面肯定有對(duì)它的詳盡解釋(而且是用你很容易明白的話)。
原書基于Visual Studio 2015寫作,后來(lái)Visual Studio 2017問(wèn)世,所以譯者在中文版中添加了對(duì)Visual Studio 2017的支持。不想用微軟的IDE?沒問(wèn)題,譯者在這里推薦一些IDE:CodeLite,Dev C++,Eclipse,NetBeans……實(shí)在太多了。具體鏈接可參考譯者的主頁(yè):https://bookzhou.com。
除了最基本的C++編程概念,一些“新潮”的東西都有所涉及,包括STL模板、C++11和C++14的新功能。至于指針,聽起來(lái)很“高大上”,但讀了本書之后,就會(huì)發(fā)現(xiàn)其實(shí)是小事一樁。關(guān)鍵在于,所有這些內(nèi)容作者都用淺顯的語(yǔ)言講得明明白白。
本書之所以有趣,是因?yàn)槔锩嬷v述了太多實(shí)際問(wèn)題的解決方案,例如漢諾塔、三門和撲克牌(發(fā)牌、洗牌和判斷一手牌的大小)等。
邏輯和游戲,這是你通過(guò)本書來(lái)學(xué)習(xí)C++的主要?jiǎng)訖C(jī)之一(就不說(shuō)就業(yè)必備技能了)。
最后,本書幾乎所有源代碼的注釋和輸出內(nèi)容都有中文。中文版代碼可通過(guò)譯者主頁(yè)下載(https://bookzhou.com)。
前言
C++可以說(shuō)是當(dāng)今世界最重要的編程語(yǔ)言。
該語(yǔ)言廣泛運(yùn)用于創(chuàng)建從操作系統(tǒng)到字處理軟件的商業(yè)應(yīng)用。曾有一段時(shí)間大型應(yīng)用程序需用機(jī)器碼來(lái)寫,因計(jì)算機(jī)容量太小,其他都裝不了。但今非昔比。比爾·蓋茨(Bill Gates)不得不將整個(gè)BASIC壓縮成64K的時(shí)代一去不復(fù)返了!
作為C語(yǔ)言的繼任者,C++在保留了開發(fā)高效率程序這一目標(biāo)的同時(shí),還最大化提升了程序員的生產(chǎn)力。它生成的可執(zhí)行文件在簡(jiǎn)潔性上一般僅次于機(jī)器碼,但能干的事兒要多得多。C++大多數(shù)時(shí)候都是專業(yè)人員的首選語(yǔ)言。
然而,名氣雖大,C++卻不是最容易學(xué)的。這正是寫作本書的目的。
我們是來(lái)找樂子的
任何值得學(xué)的都值得付出努力。但不是說(shuō)這個(gè)過(guò)程就不能變得更有趣,本書的目的就是幫助大家輕松有趣地學(xué)會(huì)C++。我從20世紀(jì)80年代開始C編程,從90年代開始C++編程,創(chuàng)建過(guò)商業(yè)和系統(tǒng)級(jí)的應(yīng)用程序。接觸過(guò)各種陷阱,比如未初始化的指針和在if條件中該用兩個(gè)等號(hào)(==)的時(shí)候用了一個(gè)(=)。我可以指導(dǎo)你避開多年前我要花上好幾個(gè)小時(shí)來(lái)調(diào)試的錯(cuò)誤。
我也喜歡邏輯和游戲。學(xué)習(xí)一門編程語(yǔ)言并不一定意味著枯燥。本書將探索漢諾塔和三門等有趣的問(wèn)題。
圖表能使學(xué)習(xí)編程的過(guò)程更有趣和容易。本書將大量運(yùn)用表格和插圖。
為什么選擇C和C++
不是說(shuō)其他編程語(yǔ)言有什么問(wèn)題。我是全世界首批寫Visual Basic代碼的人(Microsoft主導(dǎo)的一個(gè)項(xiàng)目),而且我承認(rèn)Python是高級(jí)腳本工具。
但只要稍微注意一下,就會(huì)發(fā)現(xiàn)C++學(xué)起來(lái)同樣容易。語(yǔ)法比Visual Basic和Python復(fù)雜一些,但C++長(zhǎng)久以來(lái)都被公認(rèn)為是一種簡(jiǎn)潔、靈活和優(yōu)雅的語(yǔ)言。這正是其前身C語(yǔ)言受這么多專家推崇的原因。
C語(yǔ)言一開始的思路就是為重復(fù)寫的代碼行提供快捷方式。例如,可用++n使變量遞增1,而不用寫n = n + 1。用C或C++寫的程序越多,就越離不開這些快捷方式,離不開它們的簡(jiǎn)潔和靈活。
C++是怎樣“思考對(duì)象”的
計(jì)算機(jī)科學(xué)家丹尼斯·里奇(Dennis Ritchie)創(chuàng)建C來(lái)作為寫操作系統(tǒng)的一種工具(1983榮獲圖靈獎(jiǎng))。他需要一種簡(jiǎn)潔和靈活的語(yǔ)言,可在必要時(shí)操縱像物理地址這樣的低級(jí)東西。結(jié)果是C在其他領(lǐng)域也快速流行。
后來(lái),比雅尼·斯特勞斯特魯普(Bjarne Stroustrup)創(chuàng)建了C++,最開始只是一種“有類的C”。添加了面向?qū)ο蠊δ埽@是我以后要花很多筆墨講述的主題(從第10章起)。面向?qū)ο笫菄@智能數(shù)據(jù)類型構(gòu)建程序的一種方式。本版的一個(gè)主要目標(biāo)就是演示如何將面向?qū)ο笞鳛橐环N高級(jí)的、更模塊化的編程方式,以及如何“思考對(duì)象”。
C++最終演化成遠(yuǎn)非僅僅一種“有類的C”。多年來(lái)添加了許多新功能,最引人注目的是標(biāo)準(zhǔn)模板庫(kù)(Standard Template Library,STL)。STL不難學(xué),本書將演示如何用它簡(jiǎn)化許多編程工作。假以時(shí)日,這個(gè)庫(kù)會(huì)成為C++程序員的工作中心。
第3版的目標(biāo)
第3版的目標(biāo)很簡(jiǎn)單,就是保持過(guò)去版本的優(yōu)勢(shì)并修正一些缺陷,尤其是這一版更有趣且更易使用。前兩版的大多數(shù)特色都予以保留,但更著重C++的實(shí)用性(和娛樂性)和面向?qū)ο螅辉诤苌儆玫降墓δ苌匣ㄌ喙P墨。例如,我假定你不想寫自己的string類,因?yàn)樗行碌腃++編譯器很早就在提供該功能了。
這一版還強(qiáng)調(diào)了C++社區(qū)的“正確”語(yǔ)言規(guī)范。這些規(guī)范要么已成為標(biāo)準(zhǔn),要么馬上成為標(biāo)準(zhǔn)。
這一版正式使用Microsoft C++編譯器(社區(qū)版)。也可以用其他順手的C++編譯器,因?yàn)榇蠖鄶?shù)例子都是用標(biāo)準(zhǔn)C++寫成的。不過(guò),第1章會(huì)指導(dǎo)你使用與Visual Studio配套提供的Microsoft編譯器。
本書還包括其他特色。
* 涵蓋C++11和C++14新功能:這一版會(huì)介紹自C++11以來(lái)引入的許多新功能,并介紹C++14的一些前沿功能。假定你的C++編譯器至少和Microsoft社區(qū)版一樣新,所以這一版拿掉了一些過(guò)時(shí)的編程規(guī)范。
* 更多謎題、游戲、練習(xí)和插圖:這些特色都是第2版大受歡迎的要素。第3版進(jìn)一步“發(fā)揚(yáng)光大”。
* 更著眼于面向?qū)ο蟮?ldquo;為什么”和“怎么做”:C++的類和對(duì)象功能一直都被寄予厚望。本版在修訂時(shí)的一個(gè)主要目標(biāo)就是強(qiáng)調(diào)類和對(duì)象的實(shí)用性以及如何“思考對(duì)象”。
* 更多STL的知識(shí):標(biāo)準(zhǔn)模板庫(kù)不難學(xué),能簡(jiǎn)化編程并提高效率。這一版會(huì)更多地探索STL。
* 有用的參考:這一版在書末保留并擴(kuò)展了快速參考附錄。
怎么開始
這一版假定你對(duì)編程一無(wú)所知或只知道一點(diǎn)。會(huì)開電腦,會(huì)用菜單系統(tǒng)、鍵盤和鼠標(biāo)就行。第1章將指導(dǎo)你安裝和使用Microsoft C++社區(qū)版。注意,該版本的C++在Microsoft Windows上運(yùn)行。使用其他系統(tǒng)(比如Mac OS)需下載不同的工具。但C++常規(guī)的東西是共通的,本書大多數(shù)內(nèi)容可以直接使用。
更多圖標(biāo)
前兩版引入了許多有用的圖標(biāo),這一版更多,作用是幫你快速定位自己需要的內(nèi)容。請(qǐng)?zhí)貏e留意這些符號(hào),它們強(qiáng)調(diào)了需要特別關(guān)注的部分。
剖析示例程序,逐行解釋工作原理。不需要自己讀長(zhǎng)長(zhǎng)的代碼,我?guī)湍阕隽耍?或者說(shuō),我們一起研究。)
在每個(gè)完整的示例程序后面,都提供了至少一個(gè)練習(xí)(通常幾個(gè))。它們圍繞例子展開,鼓勵(lì)你修改并擴(kuò)展剛才看到的程序代碼。這是最好的學(xué)習(xí)方式。練習(xí)答案在作者的網(wǎng)站(brianoverland.com)提供。
圍繞一個(gè)例子展開,分析如何改進(jìn)、變得更短或更高效。
修改例子做其他事情。
提示新的語(yǔ)言關(guān)鍵字,清楚解釋其用法。
和“關(guān)鍵字”相似,但提示的是不涉及關(guān)鍵字的C++語(yǔ)法。
“偽代碼”是用自然語(yǔ)言描述的程序或程序片斷。作用是幫你弄明白程序需要做的事情。然后將其直接轉(zhuǎn)換成C++語(yǔ)句即可。
本書還穿插了一些有意思的“花絮”。不是特別關(guān)鍵,供閑暇時(shí)閱讀。
列出重要事項(xiàng),要么是需要注意的特殊事項(xiàng),要么是一些“陷阱”,例如版本問(wèn)題和需要最新編譯器的一些語(yǔ)言功能。
表明當(dāng)前主題只適合最新的C++14語(yǔ)言規(guī)范。
不涉及哪些主題
生命中沒什么是免費(fèi)的,除了愛、落日、空氣和小狗。(實(shí)際上小狗都可能不是免費(fèi)的。前不久我看了一些大丹犬,每只都要大概3000美元。但真的很可愛。)
由于需要強(qiáng)調(diào)對(duì)于初級(jí)到中級(jí)程序員來(lái)說(shuō)重要的主題,所以這一版稍微減少了對(duì)于一些不常用功能的討論。例如,操作符重載(前期一般都不會(huì)在類中編碼這一功能)被移到了最后一章。其他大多數(shù)主題(包括相對(duì)高級(jí)的主題,比如位操作)都只是稍微提了一下。重點(diǎn)還是基礎(chǔ)。
C++或許是目前規(guī)模最大的編程語(yǔ)言,就像英語(yǔ)擁有自然語(yǔ)言中最大的詞庫(kù)一樣。一本面面俱到的入門書,這個(gè)出發(fā)點(diǎn)本身就是錯(cuò)的。但是,如果想學(xué)習(xí)C++的高級(jí)主題,也有大量資源可以參考。
有兩本書我特別推薦。一本是C++語(yǔ)言創(chuàng)始人比雅尼·斯特勞斯特魯普(Bjarne Stroustrup)的《C++編程語(yǔ)言》第4版,這是一本權(quán)威、全面和詳盡的大部頭參考書,建議在C++上手之后學(xué)習(xí)。如一本易于使用的參考書,推薦我自己寫的C++ for the Impatient,它覆蓋了語(yǔ)言和標(biāo)準(zhǔn)模板庫(kù)的幾乎一切內(nèi)容。
圖形用戶界面(GUI)編程對(duì)平臺(tái)依賴較大,要選擇專門的書來(lái)學(xué)習(xí)。本書介紹核心C++語(yǔ)言及其庫(kù)和模板,這些是獨(dú)立于平臺(tái)的。
再次提醒:找樂子
C++沒什么好怕的。偶有陷阱,但我會(huì)引領(lǐng)你繞開。在你不小心或者不知道自己在做什么的時(shí)候,C++有時(shí)會(huì)顯得稍難。但通過(guò)不停思考這些問(wèn)題,情況會(huì)變得越來(lái)越好。
C++并不抽象。希望你通過(guò)實(shí)例來(lái)解謎和游戲,并從中獲得樂趣。雖然本書目的是教會(huì)你一門新知識(shí),但也希望寓教于樂。
源代碼、練習(xí)答案和勘誤
從作者或譯者主頁(yè)下載本書源代碼、練習(xí)答案和勘誤。作者主頁(yè)是http://brianoverland.com/books/或https://github.com/transbot/CPP-without-fear。譯者主頁(yè)是https://bookzhou.com。
致謝
這一版是編輯金姆(Kim Boedigheimer)和我在西雅圖派克市場(chǎng)附近喝茶的時(shí)候確定下來(lái)的。這本書更像是她的孩子而不是我的。她帶來(lái)了一個(gè)出色的編輯和生產(chǎn)團(tuán)隊(duì),極大簡(jiǎn)化了我的工作。團(tuán)隊(duì)成員包括科瑟爾(Kesel Wilson)、黛博拉(Deborah Thompson)、克里斯(Chris Zahn)、蘇珊(Susan Brown Zahn)和約翰(John Fuller)。
特別感謝萊奧爾(Leor Zolman)出色的技術(shù)審校。感謝微軟前軟件開發(fā)工程師約翰(John R. Bennett)提供許多有益的反饋。還要感謝網(wǎng)絡(luò)作家大衛(wèi)(David Jack)提供一些有用的插圖。
目錄
第1章 開始使用C++ 11.1 安裝Microsoft Visual Studio2015/2017 11.2 用Microsoft Visual Studio創(chuàng)建項(xiàng)目 31.3 用Microsoft Visual Studio寫程序 41.4 用Visual Studio運(yùn)行程序 51.5 兼容性問(wèn)題#1:stdafx.h或pch.h 51.6 兼容性問(wèn)題#2:暫停屏幕 61.7 如果不用Visual Studio 71.8 跳到下個(gè)打印行 101.9 存儲(chǔ)數(shù)據(jù):C++變量 131.10 數(shù)據(jù)類型簡(jiǎn)介 141.11 變量名和關(guān)鍵字的注意事項(xiàng) 21小結(jié) 22第2章 判斷語(yǔ)句 252.1 準(zhǔn)備功課:數(shù)據(jù)類型 252.2 在程序中判斷 262.3 循環(huán)入門 332.4 C++的真和假 392.5 遞增操作符(++) 392.6 語(yǔ)句和表達(dá)式 412.7 布爾(短路)邏輯入門 422.8 Math庫(kù)入門 45小結(jié) 51第3章 判斷語(yǔ)句進(jìn)階 533.1 do-while循環(huán) 533.2 隨機(jī)數(shù)入門 563.3 switch-case語(yǔ)句 63小結(jié) 67第4章 全能又好用的for語(yǔ)句 694.1 計(jì)數(shù)循環(huán) 694.2 for循環(huán)入門 704.3 大量例子 714.4 局部循環(huán)變量 754.5 語(yǔ)言對(duì)比:Basic語(yǔ)言的For語(yǔ)句 78小結(jié) 79第5章 被大量調(diào)用的函數(shù) 815.1 函數(shù)的概念 815.2 函數(shù)的使用 825.3 局部和全局變量 905.4 遞歸函數(shù) 925.5 繼續(xù)游戲 107小結(jié) 108第6章 數(shù)組 1116.1 C++數(shù)組初探 1116.2 初始化數(shù)組 1126.3 基于零的索引 1136.4 字節(jié)串和字符串?dāng)?shù)組 1216.5 二維數(shù)組:進(jìn)入矩陣 127小結(jié) 128第7章 指針 1317.1 指針到底是什么? 1317.2 指針概念 1327.3 聲明和使用指針 1337.4 函數(shù)中的數(shù)據(jù)流 1407.5 交換:另一個(gè)使用指針的函數(shù) 1417.6 引用參數(shù)(&) 1477.7 指針運(yùn)算 1477.8 指針和數(shù)組處理 149小結(jié) 153第8章 字符串:分析文本 1558.1 計(jì)算機(jī)如何存儲(chǔ)文本 1558.2 單字符和字符串 1698.3 C++語(yǔ)言的string類 172小結(jié) 179第9章 文件:電子存儲(chǔ) 1839.1 文件流對(duì)象入門 1839.2 對(duì)比文本文件和二進(jìn)制文件 1919.3 二進(jìn)制運(yùn)算基礎(chǔ) 193小結(jié) 200第10章 類和對(duì)象 20310.1 理解OOP 20310.2 對(duì)象的含義 20410.3 Point:一個(gè)簡(jiǎn)單的類 20610.4 Fraction類基礎(chǔ) 212小結(jié) 229第11章 構(gòu)造函數(shù) 23111.1 構(gòu)造函數(shù)入門 23111.2 引用變量和引用參數(shù)(&) 24211.3 拷貝構(gòu)造函數(shù) 24311.4 將字符串轉(zhuǎn)換為分?jǐn)?shù)的構(gòu)造函數(shù) 245小結(jié) 247第12章 兩個(gè)完整的OOP例子 24912.1 動(dòng)態(tài)對(duì)象創(chuàng)建 24912.2 new和delete的其他用法 25012.3 二叉樹應(yīng)用 25112.4 漢諾塔問(wèn)題:動(dòng)畫版 260小結(jié) 267第13章 用STL簡(jiǎn)化編程 26913.1 列表模板 26913.2 設(shè)計(jì)RPN計(jì)算器 27713.3 正確解釋尖括號(hào) 286小結(jié) 287第14章 面向?qū)ο蟮娜T問(wèn)題 28914.1 邏輯推理 28914.2 電視節(jié)目(面向?qū)ο蟀? 291小結(jié) 307第15章 面向?qū)ο蟮膿淇伺朴螒?span id="epizqqp1gsyu" class="Apple-tab-span" style="white-space:pre"> 30915.1 贏在拉斯維加斯 30915.2 怎樣抽牌 31015.3 vector模板 31915.4 判斷牌型 325小結(jié) 333第16章 多態(tài)版撲克牌游戲 33516.1 多種牌墩 33516.2 “純虛”和其他抽象事項(xiàng) 34516.3 抽象類和接口 34616.4 面向?qū)ο蠛虸/O 347小結(jié) 354第17章 C++14新功能 35717.1 C++14最新功能 35717.2 C++11引入的功能 362小結(jié) 381第18章 操作符函數(shù):用類來(lái)完成 38518.1 操作符函數(shù)入門 38518.2 作為全局函數(shù)的操作符函數(shù) 38718.3 通過(guò)引用提高效率 38918.4 操作其他類型 39918.5 類賦值函數(shù)(=) 39918.6 相等性測(cè)試函數(shù)(==) 40118.7 類的“打印”函數(shù) 40218.8 結(jié)語(yǔ)(關(guān)于操作符) 406小結(jié) 407附錄A 操作符 411附錄B 數(shù)據(jù)類型 419附錄C 語(yǔ)法總結(jié) 425附錄D 預(yù)處理指令 437附錄E ASCII代碼 443附錄F 標(biāo)準(zhǔn)庫(kù)函數(shù) 447附錄G I/O流對(duì)象和類 455附錄H STL類和對(duì)象 461附錄I 術(shù)語(yǔ)表 469