前言
隨著科技的不斷發展,IT行業出現了數百種程式語言。C++歷經30多年的發展,依舊是一門主流的程式設計語言。在開發大型軟體(如作業系統、數據倉庫、圖形圖像處理、編譯系統等較為底層的系統軟體)上C++具有很突出的優勢與效率,同時,學習C++語言有助於讀者理解計算機運行原理,便於設計出更加健壯、穩定的系統。在就業方面,C++程式設計師普遍具有較高的身價,一名優秀的C++程式設計師無疑具有更好的就業機會與市場競爭力。圖書市場上關於C++語言程式設計的圖書不少,但真正適合於C++初學者的書籍卻並不多,這些書籍往往語法細節過多,需要大量的計算機相關知識體系,對於初學者無疑是一個巨大的挑戰。基於這個原因,筆者根據自己多年使用C++編程的經驗和心得體會寫了這本書,希望能夠引領讀者進入C++編程的殿堂。本書針對C++初學者的基礎條件,配合大量的圖表,簡明扼要地總結了C++的語法要點和結構;實例程式簡單易懂,循序漸進,使讀者能更加深刻、全面地理解C++程式設計語言,靈活、高效地利用C++語言進行程式開發。
本書以通俗易懂、生活化的例子來解釋每個知識點的用法,書中的每個例子能起到拋磚引玉的功效。這樣就避免了雲山霧罩、晦澀難懂。而且在語言上儘可能輕鬆活潑,多用類比、對比、比喻等寫作手法,而且配合了大量圖解教學,並對難點給出了必要提示。另外,本書還錄製了配套的多媒體教學視頻,以輔助讀者學習。相信這樣的一本書,可以掃清讀者學習過程中的障礙,讓讀者少走彎路,並激發學習Visual C++的興趣,從而較快地掌握Visual C++編程。
特色
1.提供配套的多媒體教學視頻本書專門錄製了配套多媒體教學視頻,幫助讀者直觀而高效地學習,從而達到事半功倍的效果。這些視頻和本書實例原始碼收錄於本書配套光碟中。
2.起點較低,不需要程式設計的基礎知識
一些初學者在學C++語言之前並沒有接觸過其他程式設計語言,本書從程式設計基礎知識講起,詳細介紹C++的語法知識和要點,使讀者對其有充分了解,從而具備一定的程式設計基礎。
3.劃分有序,編排合理
本書將C++程式設計畫分為4大部分,分別是面向結構程式設計、面向對象程式設計、泛型編程以及輸入輸出流。這4個部分在編排邏輯上依次漸進,後續知識點需要前面的知識作為鋪墊,知識結構與脈絡清晰,便於讀者理解知識點。
4.詼諧幽默,穿插了大量生活化的例子
本書避免用艱澀難懂、枯燥乏味的術語云山霧罩地分析問題,代之以輕鬆活潑、幽默直白的講解。書中的知識點儘量先給現實生活中的例子,然後與之對比或者類比,讓讀者理解。
5.詳略得當,講解通俗易懂
本書從實用角度出發,儘量避免一些生僻而又不易理解的知識點,將重點放在語言本身的難點(指針、面向對象概念)和程式設計的技巧上,並結合生動形象的例子對較難的知識點進行詳細介紹,力求使讀者儘快掌握相關開發知識。
6.強化實踐,重視套用
本書提供了大量實例,從實踐角度對C++的知識點進行形象的說明,配合相關的技巧說明,加深讀者的印象。本書最後通過一個具體項目開發案例來講述如何利用C++從零基礎開始構建一個完整項目,注重實際解決問題的能力。
7.代碼精講,注釋豐富
本書中的每段代碼都給出了詳細的解釋,並且進行了豐富的代碼注釋,便於讀者理解。而且對於大段代碼還給出了流程圖幫助讀者理解複雜的程式,如第19章的學生管理系統。
8.提供練習題,鞏固提高
本書提供了必要的練習題目,以幫助讀者鞏固和提高所學的知識,也便於相關學校教學使用。
9.提供教學PPT,輔助教學
本書專門製作了教學PPT,以便於老師的教學和學生的學習。教學PPT的下載方式參見本書封底的提示語言。
10.提供完善的技術支持和售後服務
內容及知識體系
第1篇C++編程基礎篇(第1~7章)本篇介紹了C++程式設計語言的基本數據類型,面向結構程式設計的3種基本結構,以及相關運算符的意義,介紹了函式的相關特性和套用方式。
第2篇面向對象程式設計篇(第8~11章)
本篇對面向對象程式設計進行了詳細的介紹,形象地說明了什麼是類和對象,以及它們之間的關係。接著介紹了C++面向程式設計的3大特性:繼承、多態及虛函式。對繼承和虛函式的概念與方法、多態的性質與原理進行詳細的介紹。
第3篇C++模板篇(第12~14章)
本篇主要介紹了泛型編程中的函式模板、類模板及C++標準模板庫中提供的模板。如何創建自定義的模板以及使用現有STL中的模板是本篇內容的關鍵。
第4篇輸入/輸出操作篇(第15~18章)
本篇主要介紹基本的輸入/輸出操作,涉及對檔案流、字元流處理。同時,對包括異常處理、預處理、string類及相關類型轉換操作符的知識點進行說明。
第5篇項目實戰篇(第19章)
整合前面所介紹的知識,通過一個具體的項目案例來說明如何利用C++進行項目開發。
配書光碟內容介紹
為了方便讀者閱讀本書,本書附帶1張DVD光碟。內容如下:
* 本書配套多媒體教學視頻;
* 本書所有實例原始碼;
* Visual C++項目開發原始碼及教學視頻。
適合閱讀本書的讀者
* 零基礎學C++的人員;
* C++程式設計師;
* C++開發愛好者;
* 專業培訓機構的學員;
* 大中專院校的學生。
閱讀本書的建議
* 沒有C++基礎知識的讀者,建議從第1章順次閱讀並演練每一個實例。
* 有一定C++基礎知識的讀者,可以根據實際情況有重點地選擇閱讀的章節。
* 對於書中提供的每個編程實例,先自己思考一下實現的思路,然後再閱讀,學習效果更好。
* 對於不易理解的概念和知識點,可以通過調試光碟中提供的實例代碼來深入理解程式的運行機制和原理。
作者
該書由池劍鋒主筆編寫。其他參與編寫的人員有陳剛、陳世瓊、黃點點、黃海力、黃紹斌、蔣春蕾、李國良、李俊娜、李曉娜、劉永純、王書勇、王挺、王文強、張偉、張小華、胡丹萍、王以榮、徐陽。目錄
第1篇C++編程基礎篇第1章C++編程前奏(教學視頻:19分鐘) 2
1.1計算機的五臟六腑 2
1.1.1控制器 3
1.1.2運算器 3
1.1.3存儲器 4
1.1.4輸入設備 4
1.1.5輸出設備 4
1.2作業系統的進化史 4
1.3程式語言的家譜 5
1.3.1機器語言 5
1.3.2彙編語言 6
1.3.3高級語言 8
1.4面向過程程式設計 8
1.5面向對象程式設計 9
1.5.1面向對象的方法由來——萬物皆是對象 10
1.5.2面向對象的基本概念 10
1.6搭建C++開發環境 11
1.6.1下載和安裝大管家——Visual C++ 6.0 11
1.6.2大管家的責任 11
1.6.3邁出第一步——第一個C++程式 15
1.7C++編程簡述 17
1.7.1C++語言特點 17
1.7.2C++的良好編程風格 18
1.8本章小結 19
1.9本章習題 20
第2章開始C++開發之旅(教學視頻:27分鐘) 21
2.1機器的螺絲--基本數據類型和常用庫函式 21
2.1.1字元集和標識符 21
2.1.2整型數據 23
2.1.3浮點型數據 24
2.1.4字元型數據 25
2.1.5字元串和枚舉常量 26
2.1.6符號常量和變數 27
2.1.7輸入/輸出函式 32
2.1.8其他常用的函式 35
2.2運算符和表達式 37
2.2.1算術運算符 37
2.2.2邏輯運算符 38
2.2.3關係運算符 39
2.2.4位操作運算符 39
2.2.5賦值運算符和相等性運算符(==) 40
2.2.6位元組數運算符(sizeof) 41
2.2.7運算符的優先權和結合性 41
2.2.8算術表達式 43
2.2.9邏輯表達式 45
2.2.10關係表達式 46
2.2.11條件表達式 47
2.2.12賦值表達式 48
2.2.13逗號表達式 49
2.3類型轉換 50
2.3.1強制類型轉換 50
2.3.2自動類型轉換 52
2.4控制結構和語句 53
2.4.1for重複結構及示例 53
2.4.2while重複結構及示例 55
2.4.3do/while重複結構及示例 56
2.4.4if-else結構及示例 57
2.4.5switch多選結構 59
2.4.6break和continue語句 61
2.4.7goto語句 62
2.5預處理 63
2.5.1檔案包含命令(#include) 63
2.5.2宏定義命令(#define) 63
2.6本章小結 64
2.7本章習題 64
第3章數組和字元串(教學視頻:30分鐘) 67
3.1一維數組 67
3.1.1一維數組定義 67
3.1.2一維數組的初始化 68
3.1.3一維數組元素的引用 68
3.1.4一維數組示例 69
3.2多維數組 71
3.2.1多維數組定義 71
3.2.2初始化多維數組 72
3.2.3多維數組套用舉例 73
3.3字元數組和字元串 74
3.3.1字元數組的定義和賦值 74
3.3.2字元串的輸入/輸出 76
3.3.3字元串套用示例 77
3.4本章小結 78
3.5本章習題 79
第4章指針與引用(教學視頻:46分鐘) 81
4.1市場經濟--指針的定義及格式 81
4.1.1什麼是指針 81
4.1.2聲明一個指針 82
4.1.3初始化指針變數 83
4.1.4指向指針的指針 84
4.2指針的運算 85
4.2.1指針的賦值運算和增減值運算 85
4.2.2指針比較運算和相減運算 87
4.2.3指針運算和地址運算 88
4.3指針和數組 89
4.3.1使用數組名的指針表示法 89
4.3.2指針數組 90
4.3.3指向數組的指針 91
4.4動態記憶體分配 94
4.4.1使用new動態分配記憶體 94
4.4.2delete釋放動態申請的記憶體 94
4.4.3malloc和free使用 96
4.4.4記憶體動態申請注意事項 97
4.4.5轉換指針 99
4.5常量指針和指向常量的指針 100
4.5.1常量指針 100
4.5.2指向常量的指針 101
4.6人人都可以有綽號--引用 102
4.6.1引用和引用的創建方法 102
4.6.2引用和指針關係 103
4.7本章小結 106
4.8本章習題 106
第5章結構體和共用體(教學視頻:51分鐘) 109
5.1一串精美的珍珠——結構體 109
5.1.1結構體的聲明 109
5.1.2結構體變數的定義和使用 110
5.1.3結構體變數初始化 111
5.1.4結構體數組定義和引用 113
5.1.5結構體指針 114
5.1.6結構體套用舉例 117
5.2大家的公共教室--共用體 121
5.2.1共用體的聲明 121
5.2.2共用體變數定義和使用 121
5.2.3共用體和結構體差異 123
5.2.4共用體數組和指針 124
5.2.5共用體套用舉例 124
5.3本章小結 126
5.4本章習題 126
第6章使用函式編程(教學視頻:45分鐘) 128
6.1神秘的黑盒子--函式 128
6.1.1程式模組化的優勢 128
6.1.2編寫一個函式 129
6.2理解函式 130
6.2.1函式的定義 130
6.2.2函式的聲明 132
6.3函式參數和返回值 133
6.3.1什麼是實參和形參 134
6.3.2參數類型轉換 135
6.3.3函式參數默認值設定 136
6.3.4函式參數值傳遞 137
6.3.5函式參數指針傳遞 138
6.3.6函式參數引用傳遞 141
6.3.7函式返回值實現 142
6.4遞歸函式和內聯函式 143
6.4.1遞歸函式示例 144
6.4.2內聯(inline)函式示例 145
6.5函式的重載 146
6.5.1重載函式特徵 146
6.5.2實現重載函式 147
6.5.3重載函式的二義性問題 148
6.6函式存儲類型 149
6.6.1外部函式 149
6.6.2內部函式 150
6.7本章小結 151
6.8本章習題 151
第7章函式高級套用(教學視頻:37分鐘) 153
7.1小心地雷--記憶體操作問題 153
7.1.1記憶體泄漏 153
7.1.2野指針 155
7.2函式與結構體、共用體 156
7.2.1結構體和共用體作為函式參數 156
7.2.2結構體和共用體作為返回值 157
7.3函式與數組 159
7.3.1一維數組作為函式參數 159
7.3.2二維數組作為函式參數 160
7.4函式指針 162
7.4.1函式指針的定義 162
7.4.2把函式作為參數傳遞 164
7.4.3函式指針數組 165
7.5main函式的參數--程式的入口 167
7.6本章小結 169
7.7本章習題 170
第2篇面向對象程式設計篇
第8章類和對象之基礎(教學視頻:43分鐘) 174
8.1類和對象的基本概念--抽象與具體辯證 174
8.1.1類的概念 174
8.1.2對象概念 175
8.1.3類和對象的關係 175
8.2類的定義格式和對象定義方法 176
8.2.1類的定義格式 176
8.2.2對象的定義方法 177
8.2.3對象成員的表示 178
8.2.4class和struct 180
8.3一個對象的生與死 180
8.3.1默認構造函式 180
8.3.2自定義構造函式 181
8.3.3析構函式 182
8.4抄作業的秘密--拷貝構造函式 184
8.4.1理解拷貝構造函式 184
8.4.2默認的拷貝構造函式 184
8.4.3拷貝構造函式方法的選擇 185
8.5公共飲水機--靜態成員 189
8.5.1靜態數據成員 189
8.5.2靜態成員函式 191
8.6隻可遠觀而不可褻玩--常成員 192
8.6.1常數據成員 192
8.6.2常成員函式 194
8.7類的類型轉換 195
8.7.1類型隱式轉換 196
8.7.2類的類型和一般數據類型之間的轉換 196
8.7.3隱式轉換存在的二義性問題 199
8.8本章小結 200
8.9本章習題 200
第9章類和對象之進階(教學視頻:44分鐘) 203
9.1類的作用域和對象的生存期 203
9.1.1類的作用域 203
9.1.2對象的生存期 205
9.2嚴格的海關--友元函式和友元類 207
9.2.1友元函式 207
9.2.2友元類 209
9.3對象指針和數組 210
9.3.1對象指針 210
9.3.2this指針 213
9.3.3對象引用 214
9.3.4對象數組 216
9.3.5對象指針數組 217
9.4按需選擇--運算符重載 219
9.4.1運算符重載的條件 219
9.4.2重載賦值運算符 220
9.4.3重載算術運算符 221
9.4.4重載下標運算符 222
9.4.5重載類型轉換 223
9.4.6重載new和delete運算符 224
9.4.7智慧型指針 225
9.5本章小結 226
9.6本章習題 227
第10章繼承(教學視頻:45分鐘) 229
10.1父子關係--何謂繼承 229
10.2繼承和聚合 230
10.3基類和派生類 230
10.3.1從基類派生出新類 230
10.3.2繼承下的訪問控制 232
10.3.3派生類的構造函式和析構函式 237
10.3.4基類和派生類的類型轉換 239
10.4多重繼承 241
10.4.1多個基類 241
10.4.2多重繼承成員的模糊性 243
10.4.3重複繼承 245
10.4.4虛基類 246
10.5本章小結 248
10.6本章習題 249
第11章虛函式和多態性(教學視頻:21分鐘) 251
11.1標準接口--什麼是多態性 251
11.2動態綁定和靜態綁定 252
11.2.1靜態綁定 252
11.2.2虛函式 255
11.2.3動態綁定 258
11.3空瓶子--抽象基類和純虛函式 260
11.3.1純虛函式的聲明和定義 261
11.3.2抽象類 262
11.3.3虛析構函式 263
11.4類成員指針 264
11.4.1數據成員指針 264
11.4.2成員函式指針 266
11.5本章小結 268
11.6本章習題 269
第3篇C++模板篇
第12章函式模板(教學視頻:16分鐘) 272
12.1認識函式模板 272
12.1.1為什麼使用模板 272
12.1.2定義函式模板 273
12.1.3使用函式模板 274
12.2函式模板的參數 276
12.3重載函式模板 278
12.3.1函式模板之間的重載 279
12.3.2顯示特化的重載 280
12.3.3普通函式重載 281
12.4本章小結 282
12.5本章習題 283
第13章類模板(教學視頻:21分鐘) 285
13.1認識類模板 285
13.2定義類模板 286
13.2.1模板參數 286
13.2.2簡單的類模板 287
13.2.3創建類模板實例 289
13.2.4類模板的靜態成員 292
13.2.5非類型的類模板參數 294
13.2.6非類型的參數實例 296
13.2.7默認參數模板 297
13.3模板顯式實例化 299
13.4類模板的友元 301
13.5模板的嵌套 303
13.6本章小結 307
13.7本章習題 307
第14章標準模板庫(STL)(教學視頻:28分鐘) 309
14.1STL概述 309
14.1.1STL組件 309
14.1.2容器(container) 310
14.1.3疊代器(iterator) 313
14.1.4算法(algorithm) 313
14.1.5STL頭檔案 314
14.2使用vector容器 315
14.2.1創建Vector容器 315
14.2.2訪問vector容器中的元素 316
14.2.3vector基本操作 318
14.2.4vector容器和數組 320
14.2.5輸入/輸出流疊代器 321
14.3創建自己的疊代器 323
14.3.1給算法傳送疊代器 323
14.3.2STL疊代器類型要求 325
14.3.3STL疊代器成員函式的條件 327
14.3.4插入疊代器 328
14.4list容器 329
14.4.1創建list容器 330
14.4.2訪問list容器中的元素 330
14.4.3list容器上的操作 331
14.5本章小結 333
14.6本章習題 333
第4篇輸入/輸出操作篇
第15章輸入/輸出流和檔案流(教學視頻:32分鐘) 336
15.1C++中的輸入/輸出流 336
15.1.1什麼是流 336
15.1.2輸出流 337
15.1.3輸入流 339
15.1.4流格式狀態 340
15.1.5流錯誤狀態 342
15.2檔案流 344
15.2.1寫入檔案 344
15.2.2讀取檔案 346
15.2.3檔案隨機訪問 347
15.2.4隨機訪問檔案的讀寫操作 348
15.3字元串流 351
15.3.1strstream相關類 351
15.3.2sstream相關類 352
15.4對象和流 353
15.4.1<<操作符重載 354
15.4.2>>操作符重載 355
15.5本章小結 356
15.6本章習題 357
第16章異常處理(教學視頻:25分鐘) 359
16.1認識異常 359
16.1.1了解異常處理 359
16.1.2拋出異常 360
16.1.3導致拋出異常的代碼 362
16.2用類對象作為異常 362
16.2.1用catch處理程式和異常 362
16.2.2用基類處理程式捕獲派生類的異常 365
16.2.3重新拋出異常 367
16.2.4捕獲所有異常 369
16.3拋出異常的函式 371
16.3.1函式try塊 371
16.3.2在構造函式中拋出異常 372
16.3.3異常和析構函式 372
16.3.4一個簡單的異常處理例子 373
16.4其他典型異常 375
16.4.1堆疊解退 375
16.4.2處理new失敗 376
16.4.3auto_ptr與記憶體泄漏 377
16.5本章小結 378
16.6本章習題 378
第17章程式的預處理(教學視頻:15分鐘) 380
17.1預處理簡介 380
17.2C++預處理程式 381
17.3include(包含)檔案 382
17.4預處理指令#define 383
17.4.1預定義符號常量 383
17.4.2帶參數的宏定義和不帶參數的宏定義 384
17.4.3宏定義取消 386
17.5條件編譯 387
17.5.1#if-#else-#endif指令 387
17.5.2#if - #elif - #endif指令 388
17.5.3#ifdef - #endif指令 388
17.5.4#ifndef - #endif指令 389
17.6#pragam 指令 389
17.7本章小結 392
17.8本章習題 392
第18章string類和其他信息(教學視頻:21分鐘) 393
18.1string類介紹和聲明 393
18.2string的輸入/輸出 394
18.3string的基本操作 395
18.3.1賦值和拼接 395
18.3.2比較字元串 397
18.3.3子串 398
18.3.4交換字元串 399
18.3.5字元插入 399
18.3.6替換字元 401
18.3.7查找 402
18.3.8轉換為C風格的char*字元串 405
18.4運行時類型信息(RTTI) 406
18.5類型轉換操作符 407
18.5.1const_cast操作符 407
18.5.2static_cast操作符 408
18.5.3reinterpret_cast操作符 408
18.6本章小結 408
18.7本章習題 409
第5篇項目實戰篇
第19章學生管理系統項目案例(教學視頻:48分鐘) 412
19.1學生管理系統項目需求與設計 412
19.1.1資料庫設計 412
19.1.2功能設計 413
19.1.2項目需求及功能分析 413
19.1.3功能模組劃分及設計 414
19.2學生管理系統編程實現 416
19.2.1student學生類 416
19.2.2filemanage數據操作類 419
19.2.3Operstu學生信息操作類 423
19.3學生管理系統總結 432