《C++探秘68講貫通C++》是2011年人民郵電出版社出版的圖書,作者是(美)RayLischner。
基本介紹
- 書名:C++探秘:68講貫通C++
- 作者: (美)Ray Lischner
- 原版名稱:Exploring C++: The Programmer’s Introduction to C++
- 譯者:劉曉娜 林健 石小兵 李傑
基本信息,內容簡介,前言,如何使用本書,本書的結構,本書的讀者對象,項目,合作,參考資料,為何叫C++探秘,C++標準,媒體評述,目錄,
基本信息
叢書名: 圖靈程式設計叢書
出版社:人民郵電出版社
ISBN:9787115242273
上架時間:2011-1-6
出版日期:2011 年1月
開本:16開
頁碼:565
版次:1-1
內容簡介
本書採用引導探索式的教學方法,將龐大的c++ 知識體系劃分成四個大部分68 講,每講都包含一個互動練習,幫助讀者循序漸進地學習c++。你可以通過這種互動快速掌握表達式、聲明、標準庫、自定義函式、類和模板等等c++ 的各方面特性,並最終掌握如何把這些特性組合起來編寫複雜的c++ 程式。
本書適合有少量其他語言編程經驗的c++ 初學者。
前言
大家好,首先謝謝你們閱讀我的書。我叫Ray,是本書的作者。從現在開始我們將要一起相處很長一段時間,因此先拉把椅子,舒服地坐下來吧。我的任務就是幫你學習C++,因此我編寫了一系列的課程,每節課(即每講)都包含一個互動練習,幫助你循序漸進地學習C++。你的任務是完成每講的閱讀和練習,通過這種方法來學習C++。
你肯定已經大致翻閱過本書。如果沒有,現在就瀏覽一下。請注意,本書和大部分其他書籍都不同。大部分編程書籍只不過是些書面講稿,作者告訴你知識點,並期望你去閱讀、學習和理解這些知識。
本書則截然不同。因為我覺得照本宣科沒什麼意義,而且照本宣科並不是最好的教學方式。本書中,你將通過閱讀、修改和編寫程式來學習編程。為此,我組織書的方式就是讓你花儘量多的時間閱讀、修改和編寫程式。
如何使用本書
本書的每一講都既有文字又有互動式練習。這些練習和你在其他書上看到的不一樣。我的作業中沒有多選、填空或者簡答題,都是對C++關鍵特性的互動式探索。在本書的前一部分,我會給出一個完整的程式。隨著學習的深入,你將可以修改和擴展該程式。很快,你就能自己編寫整個程式了。
“互動”的意思是,我提出問題,你回答問題,我儘量在行文中點評你的回答。聽起來很瘋狂吧?但是通過回答問題,你能更好地學習C++。為此,我在書中留出填寫答案的空白,你可以把答案寫在書上(除非你使用的是從朋友或者從圖書館借來的書)。實際上,我鼓勵你把所有的答案都寫在書上。只有通過回答問題,你才能真正地學好這門課。
有的問題沒有唯一正確的答案。我提出問題是為了讓你思考,讓你從一個新的角度去看待一個熟悉的問題。大部分問題都有清晰正確的答案,而我會在後繼的敘述中給出答案,因此不要向後跳讀。你要先寫下答案,然後再去驗證。有些問題可能很棘手或者需要我還沒有講到的知識,這種情況下,我估計你的答案可能會是錯的,但是錯了也沒有關係。不要擔心,我不會給你打分。(如果本書被用作正式的教材,老師應該只依據是否完成這些練習來打分,而不用管答案是否正確。老師應該另有其他的練習、測驗來評估學生們學習這門課程的效果。)不要偷看後面的內容,去抄“正確”的答案,這樣做你將學不到任何東西。
準備好了嗎?開始熱身吧。
閱讀本書時,你最重要的任務是什麼?
這個問題沒有唯一正確的答案,但確實有很多明顯錯誤的答案。希望你的答案類似於“完成每個練習”或者“理解所有的知識點”。“享受其中的樂趣”也是個好答案。
本書的結構
C++是一門複雜的語言,即便編寫最簡單的程式,也要理解該語言的很多不同方面。這門語言本身難以劃分為幾個一般性的主題,比如函式、類、語句或者表達式。因此本書沒有嘗試這樣去組織結構,而是讓你一點點增量式地學習C++:學一點這個,學一點那個,再多學一點這個,很快你就能積累足夠的知識,可以開始編寫複雜的程式了。
粗略地講,本書以基本表達式、聲明和語句開始,學會這些就足以編寫簡單的程式。在本書的前幾講中,你會學到如何使用標準庫。然後再學習如何編寫自己的函式、類和模板,再然後編寫複雜一些的程式。
但是,閱讀完本書後,你也不會立即成為專家。你還需要更多的練習,從廣度和深度上理解這門語言和庫,再不斷實踐。你需要不斷地實踐,明白了吧?
本書的讀者對象
如果你有興趣學習C++且至少了解一門其他的程式語言,則可以閱讀本書。具體地說,你不需要了解C,也不需要了解面向對象編程的知識。
C程式設計語言影響了許多其他語言的設計,比如PHP、Perl、AWK、C#當然還有C++。因此,儘管許多程式設計師不了解C和C++,但他們仍然會發現很多語言結構似曾相識,有些人甚至覺得可以跳過本書講解背景的幾講。但是我不建議這樣做!因為我會先講解一些C++獨有的特性。在少數情況下,我會告訴你什麼時候可以放心地跳過某節,而且僅僅只是跳過該節。即使你很熟悉某個語言特性,但該特性在C++中也可能會有不一樣的地方。
對於C程式設計師,固有思維模式是很危險的,雖然表面上C++和C極為相似,但是實際上C程式設計師需要克服的問題最多。從設計上說,很多C程式也是有效的C++程式,這就導致粗心的C程式設計師誤以為“好的C程式也是好的C++程式”。實際上,C和C++是不同的語言,各自有不同的習語和特質。要成為一名高效的C++程式設計師,你必須學會C++的編程方式。C程式設計師需要突破已經形成的習慣,學會棄用某些C特性(比如數組),轉而使用更好的C++習語。本書的結構能幫助你以C++(而非C)的方式思考問題。
項目
本書還包括4個項目,可以利用這些項目鞏固所學的知識。每個項目都有特定的價值,可以充分運用引入該項目之前所學的C++知識。我鼓勵你嘗試每個項目,用你最拿手的軟體設計技術完成這些項目。記住,除了編寫源碼外還要編寫測試用例,要儘量讓代碼在保證正確的基礎上清晰易讀。完成你的方案之後,從本書網站下載相應檔案,並把你的方案和我的進行對比。
合作
你可以獨自一人使用本書自學C++,或由老師指導,用本書作為正式的授課教材。你還可以和同伴一起學習,這樣會更有樂趣,而且通過合作,你也能學得更多更快。此書需人手一冊,閱讀完每一課的內容並獨立完成任務。如果碰到問題,可以和你的同伴討論,但是要獨立完成練習,然後將你的答案和同伴的作比較。如果你們的答案不同,可開展討論,陳述各自的理由,看能否達成一致的見解。
請和同伴合作完成書中的項目。你可以將工作分成兩個以上的模組,或者一個人負責編碼,另一個人負責檢查;你們也可以實踐一下結對編程。總之,怎么適合就怎么來,但是要確保你理解項目中的每一行代碼。如果你們扮演不同的角色,請在不同的項目中互換角色,讓每個人都有機會做多方面的事。
參考資料
本書不能教你關於C++的所有知識,實際上沒有一本書可以做到這一點。閱讀完本書後,還應該繼續閱讀和編寫大量C++程式,並尋找其他的信息來源。本書有一個專門的指導網站。該網站上有其他書、其他網站、郵件列表、討論組、常見問題、編譯器和其他工具等的連結。你也可以從網站上下載本書所有的原始碼,以節省打字時間。
為何叫C++探秘
如果你覺得本書有點兒怪異,那敬請放心,“這些雖是瘋話,卻有深意在內”。
這層深意,就是把我在俄勒岡州立大學教計算機時所積累的東西訴諸文字,奉獻給廣大讀者。為了提高教學質量,我特意研究了知識獲取的過程,尤其是科學知識及計算機編程。
通過這幾十年的研究,我總結出這樣一點:每個人都在意識中構建了客觀世界的一個模型,而獲取新知識的過程就是向這個模型中不斷地注入新的信息,且新的信息必須與這種模型相容。但有時候,新信息與原有模型衝突,則必須要調整我們的模型以容納新的信息。我們的大腦,就是在不斷地工作,不斷地得到新的信息,而不斷地調整意識中的模型。
這種研究的結果是,課堂的重心由教師轉移到了學生身上。在過去,教師把學生當作是一個個空的容器,等著教師用知識與智慧來填充,學生都是被動地接受信息。但是現在我們明白了,學生不是被動的接受者,他們是活躍的,儘管有時他們顯得木訥而被動,不過他們的大腦每時每刻都在運轉,都在接受新的信息並把它們納入到自己的思維模型中。而教師則不再是自詡的智慧之源,而是要作為這種思維模型的引導員。並且教師不能直接地去改造他們的模型,而僅是創造一種課堂環境,讓學生有機會去調整他們自己的模型。
儘管這個研究主要針對教師,但對於作者,又何嘗不是如此呢?
因此,我不會教你C++,而是在創造一種探索的氛圍,讓讀者在其中去學習C++。儘管這種探索模式並不是研究學習和寫作的唯一方式,但它確實是通過我多年來的教學總結及完善得來,並成功運用於實踐當中的,原因有如下幾點。
它讓你不得不主動地融入到學習過程中。被動地讀書當然輕鬆,而不斷提出問題則能促使你去尋找解決方案,從而讓它們成為你的思維模型中的新部分。但如果你跳過這些問題,那就同時跳過了完善思維模型的機會。
探索過程比較短,這使你的模型能夠循序漸進地不斷完善。假如每次都要填塞大量的新信息,則很可能導致你的模型中夾雜錯誤的信息。一旦這種錯誤信息根深蒂固,則更加難以改正。因此我需要保證你的思維模式隨時都保持儘可能精確。
這些探索構建在所學內容的基礎上。我不會拋出一堆新概念,並指望你能一下子掌握它們,而是盡力把這些新概念聯繫到某些已學過的概念,保證這些概念可以牢牢地印在你的思維模型中。
它幫助你從實踐找到真知。每一講的核心並不在於去咀嚼別人的解決方案,而是讓你儘量把時間用在自主解決問題的“刀刃”上:修改原有程式,編寫新程式。
C++是一門複雜的語言,而學習C++也絕非易事。在任一組C++程式設計師中,即便一個簡單的問題都會引出不同的答案。對於大部分C++程式設計師而言,他們的語言思維模型不僅不完整,而且有缺陷,甚至還有根本性的問題。我希望能夠提供給大家一個堅實的C++基礎,從而讓你能寫出正確而有趣的程式,更重要的是,讓你可以在未來的學習中能繼續享受C++的美妙和樂趣。
C++標準
本書涵蓋了當前的標準,即ISO/IEC 14882:2003(E),Programming languages——C++。2003版的標準是一個修訂版,包括對1998版的修訂和澄清。大部分的現代編譯器遵循2003版的標準。
標準化委員會還發行了一份該標準的附錄,添加了正則表達式、數學函式等許多內容。這份附錄是標準庫的可選擴展項,稱為Technical Report 1(技術報告1),或者TR1。因為它是可選的,所以不要求廠商必須實現它。大部分廠商提供了該庫的部分實現。一些廠商實現了完整的TR1。使用本書並不需要TR1的支持,但是我在書中指出了一些情況,在這些情況下TR1能使得編碼更容易。
通過發行TR1以及讓成千上萬的C++開發人員使用它,標準化委員會獲得了寶貴的實踐經驗,並將其反饋到C++標準的下一次主要的修訂中。在我編寫本書的時候,下一次修訂也正在進行。你閱讀本書時,修訂工作可能已經完成,甚至可能有了符合新標準的編譯器和庫。新標準可能會被標記為ISO/IEC 14882:2010(E)。
即使有了全新的編譯器,本書仍然有價值。許多新特性是高級特性,因此不會影響本書。其他一些計畫中的特性恐怕就會影響所有的C++程式設計師。在本書中,我指出了有可能發生變化之處,但同時本書主要關注當前可用的和廣泛使用的工具。
媒體評述
謝天謝地,終於有一本書,可以幫助像我這樣只有一點編程基礎的人學習這門深奧的語言了。
——Amazon讀者評論
我為了自學C++買了這本書,它真是太棒了,我非常喜歡!
——Amazon讀者評論
目錄
第一部分 c++基礎
第1講 打磨工具 2
1.1 作者推薦 2
1.1.1 windows平台 2
1.1.2 macintosh os 9以及更早版本 3
1.1.3 其他平台 3
1.2 閱讀文檔 3
1.3 第一個程式 4
第2講 閱讀c++代碼 10
2.1 注釋 11
2.2 頭檔案 11
2.3 主程式 13
2.4 變數定義 13
2.5 語句 14
2.6 輸出 15
第3講 整數表達式 17
第4講 字元串 23
第5講 簡單的輸入 28
第6講 錯誤訊息 33
6.1 拼寫錯誤 34
.6.2 錯誤字元 34
6.3 未知操作符 35
6.4 未知名字 35
6.5 符號錯誤 36
6.6 從錯誤中獲得樂趣 36
第7講 for循環 37
7.1 有界循環 37
7.1.1 初始化 37
7.1.2 條件 38
7.1.3 後循環 39
7.1.4 for循環的工作原理 39
7.2 由你來做 39
第8講 格式化輸出 41
8.1 問題 41
8.2 欄位寬度 42
8.3 填充 43
8.4 std前綴 44
8.5 對齊 44
8.6 探索格式化 44
8.7 替代語法 46
8.8 由你完成 46
第9講 數組和向量 49
9.1 用向量代替數組 49
9.2 向量 50
9.3 疊代器 51
9.4 算法 53
9.5 成員類型 54
9.6 使用疊代器和算法 55
第10講 自增和自減 58
10.1 自增 58
10.2 自減 59
第11講 條件和邏輯 64
11.1 i/o和bool 64
11.2 布爾類型 65
11.3 邏輯操作符 67
11.4 舊式語法 68
11.5 比較操作符 68
第12講 複合語句 71
12.1 語句 71
12.2 局部定義和範圍 74
12.3 for循環頭中的定義 76
第13講 檔案i/o簡介 79
13.1 讀檔案 79
13.2 寫檔案 80
第14講 數據結構映射 83
14.1 使用映射 83
14.2 疊代器 84
14.3 搜尋映射 86
第15講 類型同義詞 88
15.1 typedef聲明 88
15.2 常見的類型定義 89
第16講 字元 91
16.1 字元類型 91
16.2 字元i/o 93
16.3 換行和移植性 94
16.4 轉義字元 94
第17講 字元分類 96
17.1 字元集 96
17.2 字元分類 98
17.3 區域設定 99
第18講 大小寫轉換 103
18.1 簡單的大小寫 103
18.2 複雜的大小寫 104
第19講 編寫函式 107
19.1 函式 107
19.2 函式調用 109
19.3 聲明和定義 109
19.4 再談單詞計數 111
19.5 函式main() 113
第20講 函式實參 115
20.1 實參傳遞 115
20.2 按引用傳遞 117
20.3 常量引用 119
20.4 const_iterator 120
20.5 輸出參數 121
第21講 使用算法 122
21.1 傳遞數據 122
21.2 謂詞 126
21.3 其他算法 128
第22講 重載函式名 131
第23講 大數和小數 136
23.1 長整型和短整型 136
23.1.1 長整數 137
23.1.2 短整數 137
23.2 整數字面量 138
23.3 位元組長度的整數 139
23.4 類型轉換 140
23.5 整數算術 141
23.6 重載解析 142
第24講 極大數和極小數 145
24.1 浮點數 145
24.2 浮點字面量 146
24.3 浮點特徵 147
24.4 浮點i/o 148
第25講 文檔 151
25.1 doxygen 151
25.2 結構化注釋 151
25.3 文檔標籤 152
25.4 使用doxygen 156
第26講 項目1:身體質量指數 157
第二部分 自定義類型
第27講 自定義類型 160
27.1 定義新類型 160
27.2 成員函式 161
27.3 構造函式 164
27.4 重載構造函式 166
第28講 重載操作符 167
28.1 比較有理數 167
28.2 算術操作符 171
28.3 數學函式 173
第29講 自定義i/o操作符 175
29.1 輸入操作符 175
29.2 輸出操作符 176
29.3 錯誤狀態 177
第30講 賦值與初始化 179
30.1 賦值操作符 179
30.2 構造函式 180
30.3 合併 181
第31講 編寫類 186
31.1 類的結構 186
31.2 成員函式 187
31.3 構造函式 189
第32講 深入探索成員函式 193
32.1 調用默認構造函式 193
32.2 重溫project 1 196
32.3 const成員函式 199
第33講 訪問級別 203
33.1 公有與私有 203
33.2 class與struct 206
33.3 簡單的舊式數據 206
33.4 公有還是私有 207
第34講 面向對象編程介紹 212
34.1 書籍與雜誌 212
34.2 分類 213
34.3 繼承 215
34.4 liskov置換原則 216
34.5 類型多態 216
第35講 繼承 218
35.1 派生類 218
35.2 析構函式 221
35.3 訪問級別 224
35.4 編程風格 225
第36講 虛函式 226
36.1 類型多態 226
36.2 虛函式 229
36.3 引用與切除 230
36.4 純虛函式 231
36.5 虛析構函式 232
第37講 類與類型 233
37.1 類與typedef 233
37.2 值類型 236
37.2.1 複製 236
37.2.2 賦值 236
37.2.3 比較 236
37.3 資源獲取即為初始化 239
第38講 聲明與定義 241
38.1 聲明與定義 241
38.2 內聯函式 243
38.3 變數聲明與定義 244
38.4 靜態變數 246
38.5 靜態數據成員 248
38.6 聲明符 250
第39講 使用多個源檔案 251
39.1 多個源檔案 251
39.2 聲明與定義 252
39.3 #include檔案 254
39.3.1 引號與括弧 256
39.3.2 嵌套#include指令 256
39.3.3 包含監護 257
39.3.4 文檔 258
39.4 外部變數 261
39.5 內聯函式 261
39.6 “一份定義”規則 262
第40講 函式對象 264
40.1 函式調用操作符 264
40.2 函式對象 265
40.3 復用成員函式 269
40.4 生成器函子 270
第41講 有用的算法 272
41.1 搜尋 272
41.1.1 線性搜尋算法 272
41.1.2 二分搜尋算法 276
41.2 比較 279
41.3 重組織數據 281
41.4 複製數據 282
41.5 刪除元素 283
41.6 疊代器 284
第42講 疊代器 285
42.1 疊代器的種類 285
42.1.1 輸入疊代器 286
42.1.2 輸出疊代器 286
42.1.3 前向疊代器 286
42.1.4 雙向疊代器 287
42.1.5 隨機訪問疊代器 287
42.2 使用疊代器工作 288
42.3 const_iterator與const iterator 290
42.4 錯誤訊息 292
42.5 專用疊代器 292
42.6 疊代器要點 294
第43講 異常 296
43.1 異常介紹 296
43.2 捕獲異常 297
43.3 拋出異常 299
43.4 程式棧 300
43.5 標準異常 304
43.6 i/o異常 304
43.7 自定義異常 306
43.8 對異常的建議 307
第44講 更多操作符 309
44.1 條件操作符 309
44.2 短路操作符 311
44.3 逗號操作符 311
44.4 算術賦值操作符 313
44.5 自增與自減 315
第45講 項目2:定點數 318
第三部分 泛型編程
第46講 函式模板 324
46.1 泛型函式 324
46.2 使用函式模板 325
46.3 編寫函式模板 326
46.4 模板形參 328
46.5 模板實參 329
46.6 聲明與定義 331
46.7 成員函式模板 331
第47講 類模板 333
47.1 參數化類型 333
47.2 參數化rational類 334
47.3 使用類模板 336
47.4 重載的操作符函式 338
47.5 混合類型 340
第48講 模板特化 342
48.1 實例化與特化 342
48.2 自定義比較函式 345
48.3 特化函式模板 346
48.4 特徵 347
第49講 部分特化 349
49.1 退化的pair 349
49.2 部分特化 350
49.3 部分特化函式模板 351
49.4 值模板形參 351
第50講 名字與名字空間 353
50.1 名字空間 353
50.2 嵌套名字空間 355
50.3 全局名字空間 358
50.4 名字空間std 358
50.5 使用名字空間 359
50.5.1 using指令 359
50.5.2 using聲明 361
50.5.3 類中的using聲明 363
50.6 無名名字空間 364
50.7 名字查找 365
第51講 容器 370
51.1 容器的性質 370
51.2 技術報告1 371
51.3 成員類型 372
51.4 容器里能放什麼 373
51.5 插入與清除 374
51.5.1 順序容器的插入操作 374
51.5.2 順序容器的清除操作 375
51.5.3 關聯容器的插入操作 375
51.5.4 關聯容器的清除操作 376
51.5.5 異常 377
51.6 疊代器與引用 377
51.7 順序容器 380
51.7.1 類模板array 381
51.7.2 類模板deque 382
51.7.3 類模板list 383
51.7.4 類模板vector 384
51.8 關聯容器 385
第52講 國際字元 389
52.1 為何要“寬” 389
52.2 使用寬字元 389
52.3 寬字元串 390
52.4 寬字元的i/o操作 392
52.5 多位元組字元集 393
52.6 unicode 394
52.7 通用字元名字 396
第53講 區域設定與分面 397
53.1 問題 397
53.2 拯救者“區域設定” 398
53.3 區域設定與i/o 399
53.4 分面 399
53.5 字元類別 402
53.6 排序規則 406
第54講 文本i/o 410
54.1 檔案模式 410
54.2 字元串流 411
54.3 文本轉換 417
54.4 boost詞法轉換 420
第55講 項目3:貨幣類型 422
第四部分 實時編程
第56講 指針 424
56.1 問題 424
56.2 解決方案 432
56.3 地址與指針 433
56.4 依賴圖 434
第57講 動態記憶體 437
57.1 分配記憶體 437
57.2 釋放記憶體 438
57.3 指向為空的指針 438
57.4 實現標準容器 440
57.5 增加變數 441
57.6 特殊成員函式 448
第58講 異常-安全 452
58.1 記憶體泄漏 452
58.2 異常與動態記憶體 454
58.3 自動刪除指針 456
58.4 auto_ptr不能做的事 458
58.5 異常與構造函式 458
第59講 舊式數組 462
59.1 c風格的數組 462
59.2 數組的限制 463
59.3 動態分配數組 464
59.4 多維數組 465
59.5 c風格的字元串 466
59.6 命令行參數 466
59.7 指針運算 468
第60講 智慧型指針 470
60.1 重新審視auto_ptr 470
60.2 可複製智慧型指針 472
60.3 智慧型數組 474
60.4 pimpl 474
60.5 疊代器 482
第61講 位操作 483
61.1 將整數作為位的集合 483
61.2 位掩碼 485
61.3 移位 486
61.4 使用無符號類型安全移位 487
61.4.1 有符號與無符號類型 488
61.4.2 無符號字面量 488
61.4.3 類型轉換 489
61.5 溢出 493
61.6 位域簡介 493
61.7 可移植性 494
61.8 bitset類模板 495
第62講 枚舉 498
62.1 理想的枚舉 498
62.2 作為位掩碼的枚舉 499
62.3 模擬枚舉 500
62.3.1 枚舉計算機語言 500
62.3.2 對語言進行比較 501
62.3.3 賦值 502
62.3.4 字元串和語言 503
62.3.5 初始化 508
62.3.6 讀寫語言 508
62.3.7 使用模擬的枚舉 509
62.4 重新審視項目 510
第63講 多重繼承 512
63.1 多重基類 512
63.2 虛基類 514
63.3 類java接口 516
63.4 接口與模板 518
63.5 mix-in 519
63.6 友元來幫忙 521
第64講 特徵萃取與策略 524
64.1 案例研究:疊代器 524
64.2 疊代器特徵萃取 528
64.3 案例研究:char_traits 529
64.4 基於策略的編程 530
第65講 名字與模板 538
65.1 限定名的問題 538
65.2 非限定名的問題 540
第66講 重載函式 546
66.1 重載函式回顧 546
66.2 重載解析 549
66.2.1 候選函式 549
66.2.2 可行函式 551
66.2.3 最佳可行函式 551
66.3 默認實參 555
第67講 元編程 557
67.1 編譯時編程 557
67.2 模板特化 557
67.3 部分特化 559
第68講 項目4:計算器 566