《高質量程式設計指南——C++C語言(第3版)(修訂版)》圖書資訊

broadviewbj發表於2012-11-20
《高質量程式設計指南:C++/C語言》(林銳名作,前版曾廣泛流傳,被大量IT企業採用為面試題) 

林銳,韓永泉編著
ISBN 978-7-121-18617-2
201210月出版
價:65.00
412
16
 
編輯推薦
《大學十年》感染一代IT人,林銳親述多年一線經驗。
本書提供內建高質量程式碼必須熟練掌握的程式設計技術與規範。
“高質量”試圖挽回的是——投入大量人、材、物力的事後檢測和補救。
 
同類書目推薦:
《Effective C++:改善程式與設計的55個具體做法(第三版)(評註版)》
《More Effective C++:35個改善程式設計與設計的有效方法(中文版)》
《Effective C++:改善程式與設計的55個具體做法(第三版)中文版》
《Boost程式庫完全開發指南:深入C++“準”標準庫(修訂版)》
內容提要
高質量程式設計是軟體行業的薄弱環節,大部分企業為此付出了高昂的代價,只能透過大量的測試和改錯來提高軟體產品的質量。因此,如何讓程式設計師熟練地掌握程式設計技術和程式設計規範,在開發過程中內建高質量程式碼,是IT企業面臨的主要挑戰之一。
本書以輕鬆幽默的筆調向讀者論述了高質量軟體開發方法與C++/C程式設計規範,而這也是作者多年從事軟體開發工作的經驗總結。全書共17章,第1章到第4章重點介紹軟體質量和基本的程式設計方法;第5章到第16章重點闡述C++/C程式設計風格、物件導向程式設計方法和一些技術專題;第17章闡述STL的原理和使用方法。
本書第1版和第2版部分章節曾經在網上廣泛流傳,被國內IT企業的不少軟體開發人員採用。本書的附錄C《大學十年》是作者在網上發表的一個短篇傳記,文中所描述的充滿激情的學習和生活態度,感染了大批莘莘學子。
本書的主要讀者物件是IT企業的程式設計師和專案經理,以及大專院校的本科生和研究生。
 
目錄
1 高質量軟體開發之道... 1
1.1 軟體質量基本概念... 1
1.1.1 如何理解軟體的質量... 1
1.1.2 提高軟體質量的基本方法... 2
1.1.3 “零缺陷理念... 4
1.2 細說軟體質量屬性... 4
1.2.1 正確性... 4
1.2.2 健壯性... 4
1.2.3 可靠性... 5
1.2.4 效能... 6
1.2.5 易用性... 6
1.2.6 清晰性... 7
1.2.7 安全性... 7
1.2.8 可擴充套件性... 8
1.2.9 相容性... 8
1.2.10 可移植性... 8
1.3 人們關注的不僅僅是質量... 9
1.3.1 質量、生產率和成本之間的關係... 9
1.3.2 軟體過程改進的基本概念... 10
1.4 高質量軟體開發的基本方法... 13
1.4.1 建立軟體過程規範... 13
1.4.2 複用... 15
1.4.3 分而治之... 16
1.4.4 最佳化與折中... 17
1.4.5 技術評審... 17
1.4.6 測試... 19
1.4.7 質量保證... 21
1.4.8 改錯... 22
1.5 關於軟體開發的一些常識和思考... 23
1.5.1 有最好的程式語言嗎... 23
1.5.2 程式設計是一門藝術嗎... 23
1.5.3 程式設計時應該多使用技巧嗎... 24
1.5.4 換更快的計算機還是換更快的演算法... 24
1.5.5 錯誤是否應該分等級... 24
1.5.6 一些錯誤的觀念... 25
1.6 小結... 25
2 程式語言發展簡史... 27
2.1 程式語言大事記... 27
2.2 Ada的故事... 31
2.3 C/C++發展簡史... 31
2.4 BorlandMicrosoft之爭... 32
2.5 Java陣營與Microsoft的較量... 33
2.6 小結... 36
3 程式的基本概念... 37
3.1 程式設計語言... 37
3.2 語言實現... 38
3.3 程式庫... 40
3.4 開發環境... 40
3.5 程式的工作原理... 41
3.6 良好的程式設計習慣... 42
4 C++/C程式設計入門... 45
4.1 C++/C程式的基本概念... 45
4.1.1 啟動函式main() 45
4.1.2 命令列引數... 47
4.1.3 內部名稱... 48
4.1.4 連線規範... 49
4.1.5 變數及其初始化... 51
4.1.6 C Runtime Library. 52
4.1.7 編譯時和執行時的不同... 52
4.1.8 編譯單元和獨立編譯技術... 54
4.2 基本資料型別和記憶體映像... 54
4.3 型別轉換... 56
4.3.1 隱式轉換... 56
4.3.2 強制轉換... 58
4.4 識別符號... 60
4.5 轉義序列... 61
4.6 運算子... 62
4.7 表示式... 63
4.8 基本控制結構... 65
4.9 選擇(判斷)結構... 65
4.9.1 布林變數與零值比較... 66
4.9.2 整型變數與零值比較... 67
4.9.3 浮點變數與零值比較... 67
4.9.4 指標變數與零值比較... 69
4.9.5 if語句的補充說明... 69
4.9.6 switch結構... 70
4.10 迴圈(重複)結構... 71
4.10.1 for語句的迴圈控制變數... 72
4.10.2 迴圈語句的效率... 73
4.11 結構化程式設計原理... 78
4.12 goto/continue/break語句... 79
4.13 示例... 79
5 C++/C常量... 85
5.1 認識常量... 85
5.1.1 字面常量... 85
5.1.2 符號常量... 86
5.1.3 契約性常量... 87
5.1.4 列舉常量... 87
5.2 正確定義符號常量... 87
5.3  const#define的比較... 88
5.4 類中的常量... 89
5.5 實際應用中如何定義常量... 90
6 C++/C函式設計基礎... 95
6.1 認識函式... 95
6.2 函式原型和定義... 96
6.3 函式呼叫方式... 97
6.4 認識函式堆疊... 99
6.5 函式呼叫規範... 100
6.6 函式連線規範... 101
6.7 引數傳遞規則... 102
6.8 返回值的規則... 104
6.9 函式內部實現的規則... 107
6.10 儲存型別及作用域規則... 109
6.10.1 儲存型別... 109
6.10.2 作用域規則... 110
6.10.3 連線型別... 111
6.11 遞迴函式... 113
6.12 使用斷言... 116
6.13 使用const提高函式的健壯性... 118
6.13.1 const修飾函式的引數... 118
6.13.2 const修飾函式的返回值... 119
7 C++/C指標、陣列和字串... 121
7.1 指標... 121
7.1.1 指標的本質... 121
7.1.2 指標的型別及其支援的運算... 123
7.1.3 指標傳遞... 125
7.2 陣列... 126
7.2.1 陣列的本質... 126
7.2.2 二維陣列... 128
7.2.3 陣列傳遞... 129
7.2.4 動態建立、初始化和刪除陣列的方法... 131
7.3 字元陣列、字元指標和字串... 133
7.3.1 字元陣列、字串和'\0'的關係... 133
7.3.2 字元指標的誤區... 134
7.3.3 字串複製和比較... 134
7.4 函式指標... 134
7.5 引用和指標的比較... 137
8 C++/C高階資料型別... 141
8.1 結構(struct... 141
8.1.1 關鍵字structclass的困惑... 141
8.1.2 使用struct 142
8.1.3 位域... 145
8.1.4 成員對齊... 147
8.2 聯合(Union... 159
8.3 列舉(Enum... 161
8.4 檔案... 162
9 C++/C編譯預處理... 165
9.1 檔案包含... 165
9.1.1 內部包含衛哨和外部包含衛哨... 165
9.1.2 標頭檔案包含的合理順序... 166
9.2 宏定義... 166
9.3 條件編譯... 169
9.3.1 #if#elif#else. 169
9.3.2 #ifdef #ifndef 170
9.4 #error 170
9.5 #pragma. 171
9.6 ###運算子... 171
9.7 預定義符號常量... 172
10 C++/C檔案結構和程式版式... 173
10.1 程式檔案的目錄結構... 173
10.2 檔案的結構... 174
10.2.1 標頭檔案的用途和結構... 174
10.2.2 版權和版本資訊... 175
10.2.3 原始檔結構... 176
10.3 程式碼的版式... 176
10.3.1 適當的空行... 176
10.3.2 程式碼行及行內空格... 177
10.3.3 長行拆分... 178
10.3.4 對齊與縮排... 179
10.3.5 修飾符的位置... 180
10.3.6 註釋風格... 180
10.3.7 ADT/UDT版式... 181
11 C++/C應用程式命名規則... 183
11.1 共性規則... 183
11.2 簡單的Windows應用程式命名... 184
12 C++物件導向程式設計方法概述... 187
12.1 漫談物件導向... 187
12.2 物件的概念... 188
12.3 資訊隱藏與類的封裝... 189
12.4 類的繼承特性... 193
12.5 類的組合特性... 199
12.6 動態特性... 200
12.6.1 虛擬函式... 200
12.6.2 抽象基類... 201
12.6.3 動態繫結... 203
12.6.4 執行時多型... 206
12.6.5 多型陣列... 207
12.7 C++物件模型... 214
12.7.1 物件的記憶體映像... 214
12.7.2 隱含成員... 224
12.7.3 C++編譯器如何處理成員函式... 225
12.7.4 C++編譯器如何處理靜態成員... 225
12.8 小結... 226
13 物件的初始化、複製和析構... 229
13.1 建構函式與解構函式的起源... 229
13.2 為什麼需要建構函式和解構函式... 230
13.3 建構函式的成員初始化列表... 232
13.4 物件的構造和析構次序... 234
13.5 建構函式和解構函式的呼叫時機... 235
13.6 建構函式和賦值函式的過載... 236
13.7 示例:String的建構函式和解構函式... 238
13.8 何時應該定義複製建構函式和複製賦值函式... 239
13.9 示例:類String的複製建構函式和複製賦值函式... 240
13.10 用偷懶的辦法處理複製建構函式和複製賦值函式... 242
13.11 如何實現派生類的基本函式... 243
14 C++函式的高階特性... 247
14.1 函式過載的概念... 247
14.1.1 過載的起源... 247
14.1.2 過載是如何實現的... 247
14.1.3 小心隱式型別轉換導致過載函式產生二義性... 249
14.2 成員函式的過載、覆蓋與隱藏... 250
14.2.1 過載與覆蓋... 250
14.2.2 令人迷惑的隱藏規則... 251
14.2.3 擺脫隱藏... 253
14.3 引數的預設值... 254
14.4 運算子過載... 255
14.4.1 基本概念... 255
14.4.2 運算子過載的特殊性... 256
14.4.3 不能過載的運算子... 257
14.4.4 過載++-- 257
14.5 函式內聯... 259
14.5.1 用函式內聯取代宏... 259
14.5.2 行內函數的程式設計風格... 260
14.5.3 慎用內聯... 261
14.6 型別轉換函式... 261
14.7 const成員函式... 264
15 C++異常處理和RTTI 267
15.1 為什麼要使用異常處理... 267
15.2 C++異常處理... 268
15.2.1 異常處理的原理... 268
15.2.2 異常型別和異常物件... 269
15.2.3 異常處理的語法結構... 270
15.2.4 異常的型別匹配規則... 272
15.2.5 異常說明及其衝突... 272
15.2.6 當異常丟擲時區域性物件如何釋放... 273
15.2.7 物件構造和析構期間的異常... 273
15.2.8 如何使用好異常處理技術... 275
15.2.9 C++的標準異常... 278
15.3 虛擬函式面臨的難題... 278
15.4 RTTI及其構成... 280
15.4.1 起源... 280
15.4.2 typeid運算子... 281
15.4.3 dynamic_cast<>運算子... 283
15.4.4 RTTI的魅力與代價... 285
16 記憶體管理... 287
16.1 記憶體分配方式... 287
16.2 常見的記憶體錯誤及其對策... 288
16.3 指標引數是如何傳遞記憶體的... 289
16.4 freedelete把指標怎麼啦... 291
16.5 動態記憶體會被自動釋放嗎... 292
16.6 杜絕野指標. 292
16.7 有了malloc/free為什麼還要new/delete. 293
16.8 malloc/free的使用要點... 295
16.9 new3種使用方式... 296
16.9.1 plain new/delete. 296
16.9.2 nothrow new/delete. 297
16.9.3 placement new/delete. 297
16.10 new/delete的使用要點... 300
16.11 記憶體耗盡怎麼辦... 301
16.12 用物件模擬指標... 302
16.13 泛型指標auto_ptr 305
16.14 帶有引用計數的智慧指標... 306
16.15 智慧指標作為容器元素... 312
17 學習和使用STL. 323
17.1 STL簡介... 323
17.2 STL標頭檔案的分佈... 324
17.2.1 容器類... 324
17.2.2 泛型演算法... 325
17.2.3 迭代器... 325
17.2.4 數學運算庫... 325
17.2.5 通用工具... 325
17.2.6 其他標頭檔案... 326
17.3 容器設計原理... 326
17.3.1 記憶體映像... 326
17.3.2 儲存方式和訪問方式... 327
17.3.3 順序容器和關聯式容器的比較... 328
17.3.4 如何遍歷容器... 331
17.3.5 儲存空間重分配問題... 332
17.3.6 什麼樣的物件才能作為STL容器的元素... 333
17.4 迭代器... 334
17.4.1 迭代器的本質... 334
17.4.2 迭代器失效及其危險性... 337
17.4.3 如何在遍歷容器的過程中正確刪除元素... 346
17.5 儲存分配器... 347
17.6 介面卡... 349
17.7 泛型演算法... 352
17.8 一些特殊的容器... 355
17.8.1 string... 356
17.8.2 bitset並非set 356
17.8.3 節省儲存空間的vector. 358
17.8.4 空容器... 360
17.9 STL容器特徵總結... 361
17.10 STL使用心得... 364
附錄A C++/C試題... 367
附錄B C++/C試題答案與評分標準... 371
附錄大學十年... 377
附錄《大學十年》後記... 395
附錄術語與縮寫解釋... 397
 
 
作者簡介
林銳,1973年生。1994年和1996年獲西安電子科技大學應用物理學士學位和微電子碩士學位,2000年獲浙江大學計算機應用博士學位。大學期間兩度被評為中國百名跨世紀優秀大學生,1996年獲電子工業部科技進步二等獎,1997年獲首屆中國大學生電腦大賽軟體一等獎。2000年7月加入上海貝爾有限公司,從事軟體工程、專案管理和CMM的研究推廣工作,2003年7月當選為 Alcatel 集團技術專家(Alcatel 集團授予為保持全球技術領先地位做出突出貢獻的技術專家榮譽和資格)。2004年初建立上海漫索計算機科技有限公司(
韓永泉,1975年生。1994年至2001年就讀於西安電子科技大學計算機系,獲碩士學位。2001年4月加入上海大唐行動通訊技術有限公司,擔任高階軟體工程師,從事電信裝置網管軟體的研發工作。2004年加入北京新岸線軟體科技有限公司,從事數字電視和手機電視相關軟體產品的設計、開發和研發管理工作,曾負責所在公司與上海漫索計算機科技有限公司合作開展的軟體過程改進和研發管理解決方案的實施專案。2010年加入諾基亞西門子(NSN)。物件導向和麵向元件軟體開發技術及程式設計技術的愛好者。
 
媒體評論
@ouyangj0:在中國,我很欣賞以至於崇拜的一個人便是林銳先生了。我寫文章時經常引用他的話——“作一個優秀、正直、誠實的人,為中國軟體產業的振興而努力!”他的這本書頗有經典外版書的特徵,集幽默與嚴謹於一身,很少有書能如此吸引我。誠然,它不是一本“鉅著”,但卻是學習C++過程中可以讓你享受,或停下來思考的一本書。你不必像看《C++程式設計思想》一樣慢而穩地看這本書,你甚至可以一下午就搞定它,但它卻是一本你最好能擁有的書。
 
@macogg:林銳先生的書是在你懂了一些語言之後,教給你一些真正做專案要注意的問題。對學過C語言和C++語言而沒有參與過大專案的學生以及剛參加程式設計工作的研發人員來說,都有較強參考價值。即使是有多年程式設計工作經驗的人,也建議你翻一下。
 
@gavin.mu:這本書讀了兩年多,當這些東西經潛移默化成為本能時,的確對高質量的產品設計起到了不少作用!
 
@smartm:絕對是一本好書,讓我弄懂了很多以前困惑的問題。總體感覺,這本書不是一本入門教材,也不是一本像《Inside The C++ Object Model》一樣深奧的典籍,它更像兩者之間的一個梯子,讓已經有一定基礎的讀者經由它爬上能夠理解《Inside The C++ Object Model》的高度。
 
@cn_lb:看過第一版和第二版,堪稱中國本土版的《Effective C++》和《More Effective C++》。
 
@SED:一口氣讀完,如飲甘飴。作者把個人的社會責任感融注於一本技術性書籍當中,語言風趣,文字簡潔,讀起來別有一番風味。老外的書大多不符合中國人的語言習慣,讀起來很晦澀,這本書把中文運用得很好。
 
前言
本書出版後一直受到不少軟體公司和C++程式設計師的關注,但不知不覺間也絕跡很久。不斷有讀者問我從何處可以買到本書、什麼時候再版。現在這一版本的推出,也可視作對這一詢問的一種回答。
說來慚愧,我從2002年寫完本書第1版後,再也沒有接觸過C++程式設計,現在對C++已經很陌生了。2004年1月我離開上海貝爾,創辦了上海漫索計算機科技有限公司,專注於IT企業的研發管理整體解決方案(包括軟體產品和諮詢服務)。我自己已經從技術專家轉型為企業管理者,關注商務多於軟體技術。對於出版本書第3版,我的確心有餘而力不足。幸好第2版的作者韓永泉仍然從事應用軟體開發,寶刀未老,讓我對第3版的質量充滿信心。
在撰寫這一版的時候,為了更進一步突出本書一貫強調的“高質量程式設計”理念,對原書前版的內容做了一些調整:
首先是進行了全面的修訂,改正了所有已經發現的錯誤,並對原有部分章節的內容進行了補充;
其次,刪除了第2版的第2章和第17章(名字空間和模板)。根據我們的觀察,除非是開發類庫等通用程式,第17章的內容在現階段對應用軟體開發人員一般不具有實際指導價值;
最後,增加了大約10個小節的內容,分散在各章中。這些增加的內容是實際應用軟體開發過程中經常會用到的技術,可以顯著地提高程式設計效率,增強軟體的健壯性和可移植性。
不論本書第1版和第2版是好是差,它都被過度地使用了,產生了令作者始料不及的影響。本書的試題被國內軟體公司大面積地用於C++程式設計師招聘考試,結果事先看過答案的應試者考了高分而被錄取,還真有人向我致謝;也有不少人未看過答案而考了低分未被錄取,在網上把作者罵一通。本書的試題和答案早在2002年就公開了,不知有多少人看過,我很奇怪怎麼到現在還被煞有介事地用於考試。
希望讀者正確地使用本書:請您學習和應用您(或公司)認為好的東西,不要把本書當作標準來看待,不要全部照搬,也不必花費很多時間去爭議本書是好還是壞。如果你發現書中的錯誤或不妥之處,請及時告知作者韓永泉,或發郵件至northwest_wolf@sina.com,或直接上他的Blog與他交流:http://blog.csdn.net/northwest_wolf/。
  
林銳
上海漫索計算機科技有限公司 總經理
睿泰科技集團董事、首席研發管理專家
linrui@mansuo.com
 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13164110/viewspace-749535/,如需轉載,請註明出處,否則將追究法律責任。

相關文章