C++程序設計教程(第10版 英文限量版)
[美]保羅·戴特爾(Paul Deitel),[美]哈維·戴特爾(Harvey Deitel)
相關主題
商品描述
作者簡介
目錄大綱
目錄
第1章計算機和C++簡介1
1.1引言2
1.2計算機和互聯網在工業和研究中的應用3
1.3硬件和軟件5
1.3.1摩爾定律5
1.3.2計算機組成6
1.4數據的層次模型7
1.5機器語言、匯編語言和高級語言10
1.6C和C++11
1.7程序設計語言12
1.8對象技術介紹14
1.9典型的C++開發環境17
1.10測試一個C++應用程序20
1.10.1在Windows平臺使用Visual Studio 2015進行編譯和
運行20
1.10.2在Linux平臺使用GNU C++編譯器進行編譯和運行25
1.10.3在Mac OS X平臺使用Xcode進行編譯和運行27
1.11操作系統32
1.11.1Windows——專有操作系統32
1.11.2Linux——開源操作系統32
1.11.3Apple公司的OS X及適用於iPhone、iPad和
iPod Touch設備的iOS33
1.11.4Google公司的Android33
1.12互聯網和萬維網34
1.13軟件開發的一些關鍵術語36
1.14C++11和C++14: C++語言的最新版本38
1.15Boost C++庫39
1.16緊跟信息技術的發展步伐39
第2章C++編程入門、輸入/輸出和運算符44
2.1引言45
2.2第一個C++程序: 輸出一行文本45
2.3修改第一個C++程序49
2.4另一個C++程序: 整數相加50
2.5內存的概念54
2.6算術運算55
2.7判斷: 相等運算符和關系運算符59
2.8本章小結63
第3章類、對象、成員函數和字符串入門73
3.1引言74
3.2測試Account對象75
3.2.1實例化一個對象75
3.2.2頭文件和源文件76
3.2.3調用Account類的getName成員函數76
3.2.4使用getline輸入字符串77
3.2.5調用Account類的setName成員函數77
3.3具有數據成員及Set和Get成員函數的Account類78
3.3.1Account類的定義78
3.3.2關鍵字class和類體79
3.3.3類型為string的數據成員name79
3.3.4setName成員函數80
3.3.5getName成員函數82
3.3.6訪問修飾符private和public82
3.3.7Account類的UML類圖83
3.4Account類: 使用構造函數初始化對象84
3.4.1定義Account構造函數以實現對象初始化85
3.4.2在創建Account對象時自動初始化86
3.4.3具有構造函數的Account類的UML類圖88
3.5具有set和get成員函數的軟件工程88
3.6具有余額屬性的Account類及數據驗證89
3.6.1數據成員balance89
3.6.2具有驗證功能的雙形參構造函數91
3.6.3具有驗證功能的deposit成員函數91
3.6.4getBalance成員函數91
3.6.5操作具有余額屬性的Account對象92
3.6.6具有余額屬性及deposit和getBalance成員函數的
Account類的UML類圖94
3.7本章小結94
第4章算法開發和控制語句(第1部分)103
4.1引言104
4.2算法105
4.3偽代碼105
4.4控制結構106
4.4.1順序結構106
4.4.2選擇語句108
4.4.3循環語句108
4.4.4控制結構小結109
4.5if單分支選擇語句109
4.6if…else雙分支選擇語句110
4.6.1嵌套的if…else語句111
4.6.2else懸掛問題113
4.6.3語句塊113
4.6.4條件運算符(?:)114
4.7Student類: 嵌套的if…else語句115
4.8while循環語句117
4.9構建算法: 計數器控制的循環119
4.9.1計數器控制的循環的偽代碼算法119
4.9.2實現計數器控制的循環120
4.9.3整數除法和截斷的註意事項122
4.9.4算術溢出122
4.9.5輸入驗證123
4.10構建算法: 哨兵控制的循環123
4.10.1自頂向下、逐步求精: 頂層和第一次細化124
4.10.2進行第二次細化124
4.10.3實現哨兵控制的循環126
4.10.4基本數據類型間的顯式和隱式轉換129
4.10.5格式化浮點數130
4.10.6無符號整數和用戶輸入處理130
4.11構建算法: 嵌套的控制語句131
4.11.1問題描述131
4.11.2自頂向下、逐步求精: 頂層的偽代碼表示132
4.11.3自頂向下、逐步求精: 第一次細化132
4.11.4自頂向下、逐步求精: 第二次細化132
4.11.5偽代碼的第二次完整細化133
4.11.6實現偽代碼算法的程序134
4.11.7使用列表初始化防止窄化轉換135
4.12復合賦值運算符136
4.13自增和自減運算符137
4.14基本類型不可移植140
4.15本章小結140
第5章控制語句(第2部分)和邏輯運算符159
5.1引言160
5.2計數器控制的循環的基本要素160
5.3for循環語句161
5.4使用for語句的示例165
5.5應用實例: 偶數求和166
5.6應用實例: 復利計算167
5.7案例研究: 使用DollarAmount類進行基於整數的貨幣計算171
5.7.1演示DollarAmount類172
5.7.2DollarAmount類175
5.8do…while循環語句179
5.9switch多分支選擇語句180
5.10break和continue語句186
5.10.1break語句186
5.10.2continue語句187
5.11邏輯運算符188
5.11.1邏輯與(&&)運算符188
5.11.2邏輯或(||)運算符189
5.11.3短路求值190
5.11.4邏輯非(!)運算符190
5.11.5邏輯運算符示例191
5.12易於混淆的相等(==)和賦值(=)運算符192
5.13結構化編程小結194
5.14本章小結199
第6章函數和遞歸入門211
6.1引言212
6.2C++的程序組件213
6.3數學庫函數214
6.4函數原型215
6.5函數原型和實參類型強制轉換的說明218
6.5.1函數簽名和函數原型219
6.5.2實參類型強制轉換219
6.5.3實參提升規則和隱式轉換219
6.6C++標準庫頭文件220
6.7案例研究: 隨機數生成222
6.7.1投擲六面骰子223
6.7.2投擲6000萬次六面骰子224
6.7.3使用srand函數隨機化隨機數生成器225
6.7.4使用當前時間為隨機數生成器設定種子227
6.7.5對隨機數進行比例縮放和偏移調整227
6.8案例研究: 碰運氣遊戲並引入作用域枚舉228
6.9C++11的隨機數232
6.10作用域規則233
6.11函數調用棧和激活記錄237
6.12內聯函數241
6.13引用和引用形參242
6.14默認實參245
6.15一元作用域解析運算符247
6.16函數重載248
6.17函數模板251
6.18遞歸254
6.19使用遞歸的示例: 斐波那契數列257
6.20遞歸與疊代260
6.21本章小結263
第7章類模板array和vector及捕獲異常283
7.1引言284
7.2array對象284
7.3array對象的聲明286
7.4使用array對象的示例286
7.4.1聲明array對象並使用循環初始化array對象的元素287
7.4.2在聲明中使用初始化列表初始化array對象288
7.4.3使用常量變量指定array對象的大小並用計算結果設置
array對象的元素289
7.4.4求array對象的元素之和290
7.4.5使用條形圖圖形化顯示array對象數據291
7.4.6使用array對象的元素作為計數器292
7.4.7使用array對象匯總調查結果293
7.4.8靜態局部array對象和自動局部array對象296
7.5基於範圍的for語句298
7.6案例研究: 使用array對象存儲成績的GradeBook類300
7.7array對象的排序和查找306
7.7.1排序306
7.7.2查找306
7.7.3sort和binary_search函數的演示306
7.8多維array對象307
7.9案例研究: 使用二維array對象的GradeBook類311
7.10C++標準庫中的vector類模板簡介317
7.11本章小結323
第8章指針339
8.1引言340
8.2指針變量的聲明和初始化341
8.2.1指針的聲明341
8.2.2指針的初始化342
8.2.3C++11之前的空指針342
8.3指針運算符342
8.3.1取地址(&)運算符342
8.3.2間接尋址(*)運算符343
8.3.3使用取地址(&)和間接尋址(*)運算符344
8.4使用指針的引用傳遞345
8.5內置數組349
8.5.1聲明和訪問內置數組349
8.5.2初始化內置數組350
8.5.3向函數傳遞內置數組350
8.5.4聲明內置數組形參351
8.5.5C++11: 標準庫函數begin和end351
8.5.6內置數組的局限性351
8.5.7有時需要內置數組352
8.6使用const修飾指針352
8.6.1指向非常量數據的非常量指針353
8.6.2指向常量數據的非常量指針353
8.6.3指向非常量數據的常量指針354
8.6.4指向常量數據的常量指針355
8.7sizeof運算符356
8.8指針表達式和指針算術運算358
8.8.1指針加上和減去整數359
8.8.2指針相減360
8.8.3指針賦值361
8.8.4不能間接引用void*指針361
8.8.5指針比較361
8.9指針和內置數組之間的關系361
8.9.1指針/偏移量表示法362
8.9.2以內置數組名稱作為指針的指針/偏移量表示法362
8.9.3指針/下標表示法362
8.9.4演示指針和內置數組之間的關系363
8.10基於指針的字符串(選讀)364
8.11關於智能指針的說明367
8.12本章小結367
第9章類的深入剖析385
9.1引言386
9.2Time類案例研究: 將接口和實現分離387
9.2.1類的接口388
9.2.2將接口和實現分離388
9.2.3Time類的定義388
9.2.4Time類的成員函數390
9.2.5作用域解析運算符(::)391
9.2.6在源文件中包含類的頭文件391
9.2.7Time類的成員函數setTime和拋出異常392
9.2.8Time類的成員函數toUniversalString和字符串流處理392
9.2.9Time類的成員函數toStandardString393
9.2.10隱式內聯成員函數393
9.2.11成員函數與全局函數393
9.2.12Time類的使用394
9.2.13對象大小396
9.3編譯和連接過程396
9.4類作用域和訪問類成員398
9.5訪問函數和工具函數399
9.6Time類案例研究: 具有默認實參的構造函數399
9.6.1具有默認實參的構造函數399
9.6.2構造函數重載和C++11委托構造函數404
9.7析構函數405
9.8何時調用構造函數和析構函數405
9.8.1全局作用域對象的構造函數和析構函數406
9.8.2非靜態局部對象的構造函數和析構函數406
9.8.3靜態局部對象的構造函數和析構函數406
9.8.4演示何時調用構造函數和析構函數406
9.9Time類案例研究: 返回對私有數據成員的引用或指針409
9.10默認的逐個成員賦值411
9.11const對象和const成員函數413
9.12組合: 對象作為類的成員415
9.13友元函數和友元類421
9.14使用this指針423
9.14.1隱式和顯式地使用this指針訪問對象的數據成員424
9.14.2使用this指針實現級聯的函數調用425
9.15靜態類成員429
9.15.1使用類範圍數據的動機429
9.15.2靜態數據成員的作用域和初始化429
9.15.3訪問靜態數據成員430
9.15.4靜態數據成員的演示430
9.16本章小結433
第10章運算符重載和string類447
10.1引言448
10.2使用標準庫中string類的重載運算符449
10.3運算符重載基礎453
10.3.1運算符重載不是自動的453
10.3.2不必重載的運算符453
10.3.3不能重載的運算符454
10.3.4運算符重載的規則和限制454
10.4重載二元運算符455
10.5重載二元流插入運算符和流提取運算符455
10.6重載一元運算符459
10.7重載自增和自減運算符460
10.8案例研究: Date類461
10.9動態內存管理466
10.10案例研究: Array類468
10.10.1使用Array類469
10.10.2Array類的定義473
10.11運算符作為成員函數和非成員函數的比較480
10.12類型轉換481
10.13explicit構造函數和轉換運算符482
10.14重載函數調用運算符()485
10.15本章小結485
第11章面向對象編程: 繼承497
11.1引言498
11.2基類和派生類499
11.2.1CommunityMember類的層次結構499
11.2.2Shape類的層次結構500
11.3基類和派生類之間的關系501
11.3.1創建和使用CommissionEmployee類501
11.3.2不使用繼承創建BasePlusCommissionEmployee類506
11.3.3創建CommissionEmployeeBasePlusCommissionEmployee
繼承層次結構511
11.3.4使用protected數據的CommissionEmployee
BasePlusCommissionEmployee繼承層次結構515
11.3.5使用private數據的CommissionEmployee
BasePlusCommissionEmployee繼承層次結構519
11.4派生類中的構造函數和析構函數523
11.5public、protected和private繼承525
11.6本章小結526
第12章面向對象編程: 多態性531
12.1引言532
12.2多態性介紹: 多態視頻遊戲533
12.3類繼承層次中對象之間的關系534
12.3.1從派生類對象調用基類函數534
12.3.2將派生類指針指向基類對象537
12.3.3通過基類指針調用派生類成員函數538
12.4虛函數和虛析構函數540
12.4.1為什麼虛函數是有用的540
12.4.2聲明虛函數540
12.4.3通過基類指針或引用調用虛函數541
12.4.4通過對象名稱調用虛函數541
12.4.5CommissionEmployee層次結構中的虛函數541
12.4.6虛析構函數546
12.4.7C++11: final成員函數和類546
12.5類型域和switch語句547
12.6抽象類和純虛函數547
12.6.1純虛函數548
12.6.2設備驅動程序: 操作系統中的多態性549
12.7案例研究: 使用多態性的工資發放系統549
12.7.1創建抽象基類Employee550
12.7.2創建具體派生類SalariedEmployee553
12.7.3創建具體派生類CommissionEmployee556
12.7.4創建間接具體派生類BasePlusCommissionEmployee558
12.7.5演示多態性的處理過程560
12.8多態性、虛函數和動態綁定的底層實現機制(選讀)563
12.9案例研究: 使用多態性和運行時類型信息(包括向下強制類型轉換、
dynamic_cast、typeid和type_info)的工資發放系統567
12.10本章小結570
第13章輸入/輸出流的深入剖析577
13.1引言578
13.2流579
13.2.1經典流和標準流579
13.2.2iostream庫的頭文件580
13.2.3輸入/輸出流的類和對象580
13.3輸出流581
13.3.1char*變量的輸出581
13.3.2使用put成員函數進行字符輸出582
13.4輸入流582
13.4.1get和getline成員函數583
13.4.2istream的成員函數peek、putback和ignore586
13.4.3類型安全輸入/輸出586
13.5使用read、write和gcount的非格式化輸入/輸出586
13.6流操縱符的深入剖析587
13.6.1整數流的基數(dec、oct、hex和setbase)588
13.6.2浮點精度(precision、setprecision)588
13.6.3字段寬度(width、setw)590
13.6.4用戶自定義輸出流操縱符591
13.7流的格式狀態和流操縱符592
13.7.1尾隨零和小數點(showpoint)593
13.7.2對齊方式(left、right和internal)594
13.7.3內容填充(fill、setfill)595
13.7.4整數流的基數(dec、oct、hex和showbase)597
13.7.5浮點數、科學記數法和定點記數法(scientific、fixed)597
13.7.6大寫/小寫控制(uppercase)598
13.7.7指定布爾格式(boolalpha)599
13.7.8通過flags成員函數設置和重置格式狀態600
13.8流的錯誤狀態601
13.9將輸出流綁定到輸入流604
13.10本章小結605
第14章文件處理615
14.1引言616
14.2文件和流616
14.3創建順序文件617
14.3.1打開一個文件618
14.3.2通過open成員函數打開一個文件619
14.3.3測試一個文件是否被成功打開619
14.3.4重載bool運算符620
14.3.5處理數據620
14.3.6關閉文件620
14.3.7執行樣例621
14.4從順序文件中讀取數據621
14.4.1打開一個文件用於輸入622
14.4.2從文件中讀取數據622
14.4.3文件位置指針622
14.4.4案例研究: 信用查詢程序623
14.5C++14: 讀取和寫入帶引號的文本626
14.6更新順序文件627
14.7隨機訪問文件628
14.8創建隨機訪問文件629
14.8.1使用ostream的成員函數write寫入字節數據629
14.8.2使用reinterpret_cast運算符轉換指針類型629
14.8.3信用處理程序630
14.8.4以二進制模式打開一個文件用於輸出633
14.9向隨機訪問文件隨機寫入數據633
14.9.1以二進制模式打開文件進行輸入/輸出635
14.9.2定位文件位置指針635
14.10從隨機訪問文件中順序讀取數據635
14.11案例研究: 事務處理程序637
14.12對象序列化643
14.13本章小結644
第15章標準庫的容器和疊代器655
15.1引言656
15.2容器簡介658
15.3疊代器簡介662
15.4算法簡介667
15.5序列容器667
15.5.1vector序列容器668
15.5.2list序列容器675
15.5.3deque序列容器680
15.6關聯容器681
15.6.1multiset關聯容器682
15.6.2set關聯容器685
15.6.3multimap關聯容器687
15.6.4map關聯容器689
15.7容器適配器690
15.7.1stack適配器691
15.7.2queue適配器693
15.7.3priority_queue適配器694
15.8bitset類695
15.9本章小結697
第16章標準庫算法707
16.1引言708
16.2對疊代器的最低要求708
16.3lambda表達式710
16.3.1for_each算法711
16.3.2具有空引入符的lambda表達式711
16.3.3具有非空引入符的lambda表達式——捕獲局部變量712
16.3.4lambda表達式的返回類型712
16.4算法712
16.4.1fill、fill_n、generate和generate_n算法712
16.4.2equal、mismatch和lexicographical_compare算法715
16.4.3remove、remove_if、remove_copy和remove_copy_if
算法718
16.4.4replace、replace_if、replace_copy和replace_copy_if算法721
16.4.5數學算法723
16.4.6基本的查找和排序算法726
16.4.7swap、iter_swap和swap_ranges算法731
16.4.8copy_backward、merge、unique和reverse算法732
16.4.9inplace_merge、unique_copy和reverse_copy算法735
16.4.10集合操作737
16.4.11lower_bound、upper_bound和equal_range算法740
16.4.12min、max、minmax和minmax_element算法742
16.5函數對象744
16.6標準庫算法小結747
16.7本章小結749
第17章異常處理的深入剖析757
17.1引言758
17.2異常處理控制流程和定義一個異常類759
17.2.1定義一個異常類來表示可能發生的問題類型759
17.2.2演示異常處理760
17.2.3將代碼封裝在try塊中761
17.2.4定義catch處理程序處理DivideByZeroException異常762
17.2.5異常處理的終止模型762
17.2.6用戶輸入非零分母時的程序控制流程763
17.2.7用戶輸入零分母時的程序控制流程763
17.3重新拋出異常764
17.4棧展開766
17.5何時使用異常處理767
17.6noexcept: 聲明不會拋出異常的函數768
17.7構造函數、析構函數和異常處理768
17.7.1因異常而調用的析構函數768
17.7.2初始化局部對象以獲取資源769
17.8處理new失敗769
17.8.1new在失敗時拋出bad_alloc異常769
17.8.2new在失敗時返回nullptr770
17.8.3使用set_new_handler函數處理new失敗771
17.9unique_ptr類和動態內存管理772
17.9.1unique_ptr的所有權774
17.9.2指向內置數組的unique_ptr775
17.10標準庫的異常層次結構775
17.11本章小結777
第18章自定義模板的介紹783
18.1引言784
18.2類模板785
18.2.1創建類模板StackT786
18.2.2類模板StackT的數據表示787
18.2.3類模板StackT的成員函數787
18.2.4在類模板定義的外部聲明類模板的成員函數788
18.2.5測試類模板StackT788
18.3操作類模板特化對象的函數模板790
18.4非類型形參792
18.5模板類型形參的默認實參792
18.6重載函數模板793
18.7本章小結793
第19章自定義的模板化數據結構797
19.1引言798
19.1.1盡可能優先采用標準庫的容器、疊代器和算法799
19.1.2特別專題: 構建自己的編譯器799
19.2自引用類799
19.3鏈表800
19.3.1測試鏈表的實現802
19.3.2ListNode類模板805
19.3.3List類模板806
19.3.4insertAtFront成員函數809
19.3.5insertAtBack成員函數810
19.3.6removeFromFront成員函數810
19.3.7removeFromBack成員函數811
19.3.8print成員函數812
19.3.9循環鏈表和雙向鏈表813
19.4棧814
19.4.1利用棧和鏈表之間的關系815
19.4.2基於List繼承實現Stack類模板815
19.4.3類模板中的依賴名稱816
19.4.4測試Stack類模板817
19.4.5通過List對象組合實現Stack類模板818
19.5隊列819
19.5.1隊列的應用819
19.5.2基於List繼承實現Queue類模板820
19.5.3測試Queue類模板821
19.6樹823
19.6.1基本術語823
19.6.2二叉查找樹824
19.6.3測試Tree類模板824
19.6.4TreeNode類模板826
19.6.5Tree類模板827
19.6.6Tree成員函數insertNodeHelper829
19.6.7Tree遍歷函數829
19.6.8刪除重復節點830
19.6.9二叉樹練習綜述830
19.7本章小結831
第20章查找和排序841
20.1引言842
20.2查找算法843
20.2.1線性查找843
20.2.2二分查找846
20.3排序算法850
20.3.1插入排序851
20.3.2選擇排序853
20.3.3歸並排序(遞歸實現)855
20.4本章小結862
第21章string類和字符串流處理的深入剖析869
21.1引言870
21.2string對象的賦值和連接871
21.3比較string對象873
21.4子串876
21.5交換string對象876
21.6string對象的特性877
21.7在string對象中查找子串和字符880
21.8在string對象中替換字符881
21.9向string對象插入字符883
21.10轉換為基於指針的char*字符串884
21.11疊代器886
21.12字符串流處理887
21.13C++11數值轉換函數890
21.14本章小結892
第22章位、字符、C字符串和結構體899
22.1引言900
22.2結構體的定義900
22.3typedef和using902
22.4案例研究: 模擬洗牌和發牌902
22.5位運算符905
22.6位域914
22.7字符處理庫918
22.8C字符串操作函數923
22.9C字符串轉換函數930
22.10C字符串處理庫中的搜索函數935
22.11C字符串處理庫中的內存管理函數939
22.12本章小結943
附錄A運算符的優先級和結合性959
附錄BASCII字符集961
附錄C基本數據類型963
附錄D數制965
D.1引言966
D.2將二進制數簡化為八進制數和十六進制數969
D.3將八進制數和十六進制數轉換為二進制數970
D.4將二進制數、八進制數或十六進制數轉換為十進制數970
D.5將十進制數轉換二進制數、八進制數或十六進制數971
D.6二進制負數: 二進制的補碼表示法973
附錄E預處理器979
E.1引言980
E.2#include預處理指令980
E.3#define預處理指令: 符號常量981
E.4#define預處理指令: 宏981
E.5條件編譯983
E.6#error和#pragma預處理指令985
E.7#和##運算符985
E.8預定義的符號常量985
E.9斷言986
E.10小結986
索引991
第23~26章和附錄F~J為補充閱讀內容,可以掃描前言中的二維碼獲取。
第23章其他主題
第24章C++11和C++14: 附加特性
第25章ATM案例研究(第1部分): 基於UML的面向對象設計
第26章ATM案例研究(第2部分): 實現面向對象設計
附錄FC遺留代碼
附錄GUML: 其他圖表類型
附錄H使用Visual Studio調試器
附錄I使用GNU C++調試器
附錄J使用Xcode調試器