內容簡介
用C++語言編程就是用C++語言描述和表達周圍的現實世界。按照描述和表達現實世界的需要,本書共分為12章進行講解。第1~7章為結構化編程,第8~11章為類和對象編程,第12章為C++標準庫中的容器和算法框架。
本書並沒有羅列C++語言語法,而是通過實例仔細分析所有概念背後的基礎思想、原理和技術,使讀者從中獲得學習的樂趣。本書適合從未有過編程經驗但願意努力學習程式設計的初學者。如果認真完成本書的學習,那么在程式設計領域已經有一個好的開始,可以寫相對簡單的程式,並能讀複雜的程式,為進一步的學習打下良好的理論和實踐基礎。
圖書目錄
第1章 C++語言概述 1
1.1 為什麼要學習程式設計 1
1.2 C++語言歷史 2
1.3 C++語言特點 3
1.4 C++語言程式設計風格 4
1.4.1 結構化程式設計 4
1.4.2 面向對象程式設計 5
1.4.3 泛型程式設計 7
1.5 標準庫 8
1.5.1 標準庫簡介 8
1.5.2 標準模板庫 8
習題 10
第2章 第一個C++程式 13
2.1 程式 13
2.2 入門實例 14
2.3 實例分析 15
2.3.1 注釋 15
2.3.2 使用空白字元 16
2.3.3 包含其他檔案 16
2.3.4 命名空間 17
2.3.5 定義main()函式 18
2.3.6 使用標準輸入和輸出 18
2.3.7 字元串 20
2.3.8 語句的終止 20
2.3.9 從main()函式返回值 20
2.4 編譯C++語言程式 21
2.5 連結 23
2.6 編程環境 23
2.7 家庭賬務管理系統——啟動界面 24
習題 26
第3章 數據類型 29
3.1 數據類型 29
3.1.1 整數類型 31
3.1.2 浮點類型 33
3.1.3 字元類型 34
3.1.4 布爾類型 35
3.1.5 空類型 35
3.1.6 枚舉類型 35
3.2 關鍵字 36
3.3 常量 36
3.3.1 什麼是常量 36
3.3.2 為什麼需要常量 37
3.3.3 使用常量 37
3.4 變數 38
3.4.1 什麼是變數 38
3.4.2 變數的定義 39
3.4.3 變數的命名 39
3.4.4 變數的賦值 40
3.5 結構體 42
3.5.1 結構體類型的定義和初始化 42
3.5.2 結構體變數的使用 43
3.6 家庭賬務管理系統——用戶信息 45
習題 48
第4章 控制語句 51
4.1 控制結構 52
4.2 選擇語句 52
4.2.1 布爾表達式和關係運算符 53
4.2.2 單路選擇if語句 54
4.2.3 雙路選擇if語句 55
4.2.4 多路選擇if語句 56
4.2.5 switch選擇語句 58
4.2.6 選擇結構的條件表達式 62
4.3 循環語句 63
4.3.1 for循環 64
4.3.2 for循環的嵌套 66
4.3.3 無限循環 68
4.3.4 while循環語句 69
4.3.5 do-while循環語句 71
4.3.6 幾種循環方式的比較 72
4.4 轉向語句 73
4.4.1 break語句 73
4.4.2 continue語句 73
4.4.3 goto語句 74
4.5 家庭賬務管理系統——主選單 76
習題 79
第5章 函式 81
5.1 函式簡介 81
5.2 C++程式組件 82
5.3 函式命名 83
5.4 void函式的聲明、定義和調用 83
5.5 返回值函式 86
5.6 參數傳遞 88
5.6.1 形參和實參 89
5.6.2 向函式傳遞參數 89
5.6.3 值傳遞和引用傳遞 90
5.6.4 傳遞多個參數 93
5.7 內聯函式 95
5.8 函式重載 96
5.9 家庭賬務管理系統——設定視窗標題函式 97
習題 100
第6章 數組與字元串 103
6.1 數組的概念 103
6.2 數組的聲明 104
6.3 數組的初始化 107
6.4 數組作為函式的參數 111
6.5 二維數組的聲明與初始化 114
6.6 二維數組作為函式參數 117
6.7 字元串 119
6.7.1 類C字元串 120
6.7.2 string字元串 122
6.8 家庭賬務管理系統的系統登錄 123
習題 128
第7章 指針 130
7.1 指針的概念 130
7.2 變數與指針 131
7.3 數組與指針 134
7.4 指針與引用 137
7.5 函式與指針 138
7.5.1 作為函式參數的指針 138
7.5.2 函式指針 139
7.5.3 指針函式 141
7.6 使用const修飾指針 143
7.7 動態記憶體分配 146
7.8 鍊表 149
習題 153
第8章 類和對象 155
8.1 面向過程程式設計和面向對象程式設計 156
8.2 類和對象的關係 156
8.3 聲明類類型 157
8.3.1 使用struct聲明類和使用class聲明類 157
8.3.2 對類的成員進行訪問 159
8.3.3 類的get和set方法 159
8.4 類的成員函式 162
8.4.1 成員函式的性質 162
8.4.2 在類外定義成員函式 162
8.4.3 inline成員函式 164
8.5 類聲明與成員函式定義分離 165
8.6 構造函式 168
8.6.1 什麼是構造函式 168
8.6.2 對象的初始化 168
8.6.3 構造函式的作用 169
8.6.4 帶參數的構造函式 171
8.6.5 用參數初始化表對數據成員初始化 172
8.6.6 構造函式的重載 173
8.6.7 使用默認參數值的構造函式 174
8.7 析構函式 176
8.8 公有數據的保護 179
8.8.1 常對象成員 179
8.8.2 常對象 182
8.9 靜態成員 184
8.9.1 靜態數據成員 184
8.9.2 靜態成員函式 186
8.10 示例程式:時間標記類 188
8.11 家庭賬務管理系統——用戶實體類 192
習題 199
第9章 繼承與派生 202
9.1 繼承和派生的概念 202
9.2 派生類的聲明方式 204
9.3 派生類的繼承方式 206
9.4 派生類的構造函式和析構函式 207
9.4.1 派生類的構造函式 207
9.4.2 派生類的析構函式 209
9.5 使用繼承必須滿足的邏輯關係 211
9.6 繼承在軟體開發中的重要意義 212
9.7 家庭賬務管理系統——添加賬目及賬目查詢 213
習題 219
第10章 多態性和虛函式 221
10.1 多態性的概念 221
10.2 虛函式 222
10.2.1 虛函式的作用 222
10.2.2 運行期綁定和編譯期綁定 225
10.2.3 虛函式使用方法 226
10.2.4 構造函式與析構函式 227
10.2.5 什麼情況下聲明虛函式 229
10.3 純虛函式和抽象類 230
10.3.1 純虛函式 230
10.3.2 抽象類 233
習題 236
第11章 運算符重載 238
11.1 運算符重載的概念 238
11.2 運算符重載的方法 240
11.3 基本運算符重載 243
11.4 友元函式 244
11.5 賦值運算符重載 246
11.6 輸入與輸出運算符的重載 249
11.7 特殊運算符的重載 251
11.7.1 下標運算符的重載 251
11.7.2 自增與自減運算符的重載 254
11.7.3 類型轉換運算符的重載 256
習題 260
第12章 模板與STL 261
12.1 為什麼使用模板 261
12.2 函式模板 263
12.3 類模板 267
12.4 STL 271
12.4.1 STL的組成 272
12.4.2 在程式中使用STL 273
12.5 容器 276
12.5.1 vector容器 277
12.5.2 list容器 280
12.5.3 set容器 283
12.5.4 map容器 285
12.6 算法 287
12.6.1 非變序型算法 287
12.6.2 變序型算法 289
12.6.3 排序算法 291
12.6.4 數值算法 294
12.7 家庭賬務管理系統——STL的套用 295
12.7.1 STL的vector的套用 295
12.7.2 用戶賬目信息及個人信息的持久化保存 297
習題 301
編輯背景
C++程式設計語言是由貝爾實驗室的Bjarne Stroustrup(本賈尼·史特勞斯特盧普)於20世紀80年代開發的,是一門非常優秀且被廣泛套用的面向對象程式設計語言,很多研究機構和公司都採用C++語言來開發各種高性能軟體。掌握了C++語言,就為編程入門和進階打下了牢固基礎。
興趣是最好的老師,因此,一本優秀的C++程式設計教材應該能夠激發讀者的學習興趣。本書並沒有羅列C++語言語法,而是通過實例仔細分析概念背後的基礎思想、原理和技術,讀者只有了解編程思想和原理後才能獲得學習的樂趣。而且隨著技術的發展,程式設計語言和編程工具會不斷演化甚至被取代,只有思想和原理才能保持其重要性。
本書適合那些沒有編程經驗但願意努力學習程式設計的初學者,幫助他們理解程式設計的基本原理並獲得足夠多的經驗和實踐技巧,以便更好地利用C++程式設計語言進行編程工作。
學習建議
對於C++語言初學者的第一個建議就是要多做實踐練習。在這一點上,程式設計和其他需要實踐學習的技能是很相似的。比如,不可能只通過看書就學會烹飪、開車、游泳等技能,同樣,不動手編寫程式也不可能真正學會程式設計。本書給出了大量代碼實例,並配有詳細的文字說明和圖表,讀者可以通過讀寫這些代碼來理解程式設計的思想、概念和原理,並通過親身體驗編程中出現的錯誤,來理解C++語言的特性和語法規則。總之,在學習程式設計的過程中,不斷編寫代碼、發現錯誤並進行修改的實踐練習是不可替代的,而且,這也是學習的樂趣所在。
第二個建議是要有耐心。沒有人可以一蹴而就。學習任何一種重要、有價值的技能,都要花費一些時間,而這是值得的。C++語言包含的內容很多,語法規則紛繁複雜,各種新概念層出不窮。本書遵循循序漸進的學習規律,每一章都本著簡單實用的原則,介紹一些新的、有用的概念,並通過從實際套用中獲取的例子來闡述這些概念。本書不刻意探究C++語言的語法細節,也沒有重點介紹各種高深的編程技巧,而是從頭到尾、一章章地逐步推進,讀者通過程式代碼表達思想的能力會逐步提高,對C++語言的掌握程度也會越來越深入。當然,也要經常回頭對某些內容學習第二遍甚至第三遍,這是因為在遇到不理解的內容時,讀者很可能會快速掠過,導致一些知識斷層。本書每個章節的內容安排都假定讀者已經理解了之前學過的內容。
第三個建議是不要投入大量精力去探究語法或技術細節。熟記所有的C++數據類型及使用規則也許會使你考個高分或顯得很博學,但卻對提高程式設計能力沒有幫助,並且浪費了寶貴的時間和精力。就像很多人,即使有了漢英大字典,仍然不會寫英語作文一樣。最好的做法是儘量去理解程式背後的思想和原理,知道在什麼情況下會遇到什麼問題,應採用什麼樣的解決方案,以及為什麼這么做是最好的。
第四個建議是多與他人一起學習和討論問題。這是取得進步最直接也最有效的途徑。團隊討論會幫助你表達思想,測試你對問題的理解程度,並鞏固、加深學習記憶。本書中將有一個學習團隊(3個志同道合但性格各異的學生)來共同解決一個小型的家庭賬務管理項目。建議每個讀者都能加入一個團隊,進而參與到一個小型項目中。開發一個項目的過程,也就是編寫一個完整的有用程式的過程。大多數人都會在項目開發中對程式設計產生濃厚的興趣,進而學會如何把很多事情有效組織在一起。
最後一個建議是不要急切期盼“實際的”例子。本書中的每個實例都能直接說明一種語言特性或一個概念,而很多現實世界中的實例過於凌亂,所能展示的知識也不如書中的實例多。數十萬行代碼的商業程式中所採用的技術在書中用幾行或幾十行代碼的程式同樣能展現出來。最好的理解現實世界的途徑就是好好研究一些基礎小程式。記住:麻雀雖小,五臟俱全。
如果讀者能認真完成本書的學習,可以期待已經在程式設計領域有了一個好的開始,可以編寫相對簡單的程式,並能讀懂複雜的程式,且為進一步學習打下良好的理論和實踐基礎。
本書特色
1. 每章都包含“本章要點”和“本章小結”部分,以幫助讀者明確全章的學習內容。
2. 部分章包含星號標記的選讀小節,這部分內容可以跳過而不會影響全書的連貫性,它們是為那些自學能力強且渴望挑戰的學生準備的。
3. 課後的練習題包括填空題、簡答題、編程題和獨具匠心的提升練習。提升練習部分均為生活中的實際課題,如環境污染、中國人健康指數計算、人口增長、計算機輔助教學、民意測評等,其中的部分內容在前後章節中具有一定的延續性。
4. 本書的配套資料包含課件、實例原始碼、部分練習題及編程練習答案。書中的原始碼可以自由修改、編譯,以符合自己的需要。
5. 本書按照讀者在學習程式設計中遇到的問題來組織內容,隨著讀者對程式設計的理解和實際動手能力的提高,一個主題一個主題地平滑向前推進。本書的敘述順序更像一部小說,而不是一部字典。
6. 本書每個知識點和技術要點都給出了典型實例和代碼分析,這些代碼不僅能夠一針見血地指明技術要點的本質,而且短小精煉,方便讀者自行嘗試。
7. 本書以一個家庭賬務管理系統項目案例貫穿始終,第2~6章、第8章、第9章和第12章的最後一節都是本項目部分功能的實現。每章中的知識點則使用獨立的例子,並輔以實例輸出和代碼分析,以闡述該章介紹的主題,並在討論主題的過程中逐步解決這個案例。
8. 本書虛擬了幾個人物,在每章最後通過一些有趣的對話,總結C++語言正確的學習方法。通過一些錯誤的例子和實際的錯誤代碼來進行改正,這是本教材的一大特色。
內容摘要
用C++語言編程,本質上就是用C++語言描述和表達周圍的現實世界。按照描述和表達現實世界的需要,本書可以簡單地分為3個部分:結構化編程、面向對象的編程和標準庫編程。
結構化編程部分簡要介紹C++語言的發展和特點、標準庫的知識、基本數據類型、分支和循環控制結構、基本過程化單元——函式的定義和使用方法,以及數組和指針的實現和使用。通過基本數據類型學習,讀者將學會使用int、double、string等數據類型來描述現實世界中的數據;通過邏輯控制語句學習,讀者將學會使用if-else來控制程式邏輯;通過函式學習,讀者將學會使用函式來表達完整的算法。
面向對象編程部分重點討論了類和對象、組合和繼承、多態與虛擬函式、運算符重載和泛型程式設計等內容,以循序漸進的方式介紹封裝(Encapsulation)、繼承(Inheritance)和多態(Polymorphism)這3種面向對象語言的主要技術。本部分中,藉助許多有意義的範例程式,將講解抽象化、派生類所定義對象的構造和析構次序、混合組合和繼承以建立新的類、重載虛擬函式、虛擬析構函式等被大部分C++書籍忽略的內容。面向對象的思想將幫助讀者抽象現實世界,而類和對象則幫助讀者將抽象的結果在程式中表達出來。
標準庫編程部分關註標準庫中的容器和算法框架。泛型程式設計就是將程式寫得儘可能通用,簡單而優雅,同時不損失效率。本部分展示了C++標準模板庫STL中的容器(如向量)是如何實現的,以及如何使用它們,還展示了常見的標準庫算法(如查找、排序等);簡要介紹了一些概念、術語及主要組件的使用方法,目的是使讀者對STL與泛型程式設計有一個概要性的了解。
上述內容都是C++語言中最基本又最實用的部分,通過對這些內容的學習,讀者完全可以自如地用C++語言來描述和表達現實世界。
建議和反饋
沒有絕對完美的教材(因為每個人的需求和評價角度總是差別很大),但我們會盡力使本書的內容及其支持材料接近於完美。脫離讀者是不可能寫出好教材的,為此我們需要大家的反饋。歡迎廣大讀者對本書的內容、結構、案例等提出反饋意見,以使我們在下一版中能及時做出更正、補充或修改。
作者分工
本書第1~6章由吳迪編寫,第7章和第12章由魏連鎖編寫,第8~11章由李長榮編寫,各章的家庭賬務管理系統案例由李長榮編寫,全書例題由吳迪和魏連鎖調試通過。課題組老師也參與了部分內容的編寫工作。