21天學通 C++ (第8版) Sams Teach Yourself C++ in One Hour a Day, 8/e

悉達多·饒 (Siddhartha Rao)

買這商品的人也買了...

商品描述

《21天學通C++(第8版)》通過大量短小精悍的程序詳細而全面地闡述了C++基本概念和技術,以及C++11、C++14和C++17新增的功能,包括管理輸入/輸出、循環和數組、面向對象編程、模板、使用標準模板庫、列表初始化、lambda表達式、自動類型推斷等。這些內容被組織成結構合理、聯系緊密的章節,每章都可在1小時內閱讀完畢;每章都提供了示例程序清單,並輔以示例輸出和代碼分析,以闡述該章介紹的主題。為加深讀者對所學內容的理解,每章末尾都提供了常見問題及其答案以及練習和測驗。讀者可對照附錄E提供的測驗和練習答案,瞭解自己對所學內容的掌握程度。
《21天學通C++(第8版)》是針對C++初學者編寫的,不要求讀者有C語言方面的背景知識,可作為高等院校教授C++課程的教材,也可供初學者自學C++時使用。

作者簡介

作者:[美]悉達多饒(Siddhartha Rao) 譯者:袁國忠

Siddhartha Rao是全球領先的企業軟件提供商SAP SE負責安全響應的副總裁。C++的發展讓他深信,您能編寫速度更快、更簡潔、更強大的C++應用程序。Siddhartha酷愛旅遊,還是山地自行車運動的狂熱愛好者;他期待著您對本書的反饋。

目錄大綱

第1章緒論1 
1.1C++簡史1 
1.1.1與C語言的關係1 
1.1.2C++的優點1 
1.1.3C++標準的發展歷程2 
1.1.4哪些人使用C++程序2 
1.2編寫C++應用程序2 
1.2. 1生成可執行文件的步驟2 
1.2.2分析並修復錯誤2 
1.2.3集成開發環境3 
1.2.4編寫第一個C++應用程序3 
1.2.5生成並執行第一個C++應用程序4 
1.2.6理解編譯錯誤5 
1.3C++新增的功能5 
1.4總結5 
1.5問與答6 
1.6作業6 
1.6.1測驗6 
1.6.2練習6 

第2章C++程序的組成部分8 
2.1HelloWorld程序的組成部分8 
2.1. 1預處理器編譯指令#include 9 
2.1.2程序的主體—main() 9 
2.1.3返回值10 
2.2名稱空間的概念10 
2.3C++代碼中的註釋11 
2.4C++函數12 
2.5使用std::cin和std::cout執行基本輸入
輸出操作14 
2.6總結15
2.7問與答15 
2.8作業15 
2.8.1測驗16 
2.8.2練習16 

第3章使用變量和常量17 
3.1什麼是變量17 
3.1.1內存和尋址概述17 
3.1.2聲明變量以訪問和使用內存17 
3.1.3聲明並初始化多個類型相同的
變量19 
3.1.4理解變量的作用域19 
3.1.5全局變量20 
3.1.6命名約定22 
3.2編譯器支持的常見C++變量類型22 
3.2.1使用bool變量存儲布爾值23 
3.2.2使用char變量存儲字符23 
3.2.3有符號整數和無符號整數的概念24 
3.2.4有符號整型short、int、long和longlong 24 
3.2.5無符號整型unsigned short、unsigned int、unsigned long和unsigned long long 25 
3.2.6選擇正確的數據類型以免發生溢出錯誤25 
3.2.7浮點類型float和double 26 
3.3使用sizeof確定變量的長度26 
3.4使用auto自動推斷類型28 
3.5使用typedef替換變量類型29 
3.6什麼是常量30 
3.6.1字面常量30 
3.6.2使用const將變量聲明為常量30
3.6.3使用constexpr定義常量表達式31 
3.6.4枚舉32 
3.6.5使用#define定義常量34 
3.7不能用作常量或變量名的關鍵字34 
3.8總結35 
3.9問與答36 
3.10作業37 
3.10. 1測驗37 
3.10.2練習37 

第4章管理數組和字符串38 
4.1什麼是數組38 
4.1.1為何需要數組38 
4.1.2聲明和初始化靜態數組39 
4.1.3數組中的數據是如何存儲的39 
4.1.4訪問存儲在數組中的數據40 
4.1.5修改存儲在數組中的數據41 
4.2多維數組43 
4.2.1聲明和初始化多維數組44 
4.2.2訪問多維數組中的元素44 
4.3動態數組45 
4.4 C風格字符串46 
4.5C++字符串:使用std::string 48 
4.6總結50 
4.7問與答50 
4.8作業50 
4.8.1測驗51 
4.8.2練習51 

第5章使用表達式、語句和運算符52 
5.1語句52 
5.2複合語句(語句塊) 53 
5.3使用運算符53
5.3.1賦值運算符(=) 53 
5.3.2理解左值和右值53 
5.3.3加法運算符(+)、減法運算符()、乘法運算符(*)、除法運算符(/)和求模運算符(%) 53 
5.3.4遞增運算符(++)和遞減運算符() 54 
5.3.5前綴還是後綴55 
5.3.6相等運算符(==)和不等運算符(!= ) 56 
5.3.7關係運算符56 
5.3.8邏輯運算NOT、AND、OR和XOR 58 
5.3.9使用C++邏輯運算NOT(!)、AND(&&)和OR(||) 59 
5.3.10按位運算符NOT(~)、AND(&)、OR(|)和XOR(;) 63 
5.3.11按位右移運算符(>>)和左移運算符(<<) 64 
5.3.12複合賦值運算符65 
5.3.13使用運算符sizeof確定變量佔用的內存量67 
5.3.14運算符優先級68 
5.4總結69 
5.5問與答69 
5.6作業70 
5.6.1測驗70 
5.6.2練習70 

第6章控制程序流程71 
6.1使用if…else有條件地執行71 
6.1.1使用if…else進行條件編程72 
6.1.2有條件地執行多條語句73 
6.1.3嵌套if語句74 
6.1.4使用switch—case進行 條件處理77
6.1.5使用運算符:進行條件處理80 
6.2在循環中執行代碼81 
6.2.1不成熟的goto循環81 
6.2.2while循環83 
6.2.3do…while循環84 
6.2.4for循環86 
6.2.5基於範圍的for循環88 
6.3使用continue和break修改循環的行為90 
6.3.1不結束的循環—無限循環90 
6.3.2控制無限循環91 
6.4編寫嵌套循環93 
6.4.1使用嵌套循環遍歷多維數組94 
6.4. 2使用嵌套循環計算斐波納契數列95 
6.5總結96 
6.6問與答96 
6.7作業97 
6.7.1測驗97 
6.7.2練習97 

第7章使用函數組織代碼99 
7.1為何需要函數99 
7.1.1函數原型是什麼100 
7.1.2函數定義是什麼101 
7.1.3函數調用和實參是什麼101 
7.1.4編寫接受多個參數的函數101 
7.1.5編寫沒有參數和返回值的函數103 
7.1.6帶默認值的函數參數103 
7.1.7遞歸函數—調用自己的函數105 
7.1.8包含多條return語句的函數106 
7.2使用函數處理不同類型的數據107
7.2.1函數重載107 
7.2.2將數組傳遞給函數109 
7.2.3按引用傳遞參數110 
7.3微處理器如何處理函數調用111 
7.3.1內聯函數112 
7.3.2自動推斷返回類型113 
7.3. 3lambda函數114 
7.4總結115 
7.5問與答116 
7.6作業116 
7.6.1測驗116 
7.6.2練習116 

第8章闡述指針和引用118 
8.1什麼是指針118 
8.1.1聲明指針119 
8.1.2使用引用運算符(&)獲取變量的地址119 
8.1.3使用指針存儲地址120 
8.1.4使用解除引用運算符(*)訪問指向的數據122 
8.1.5將sizeof()用於指針的結果124 
8.2動態內存分配125 
8.2.1使用new和delete動態地分配和釋放內存125 
8.2.2將遞增和遞減運算符(++和)用於指針的結果127 
8.2.3將關鍵字const用於指針129 
8.2.4將指針傳遞給函數130 
8.2.5數組和指針的類似之處131 
8.3使用指針時常犯的編程錯誤133 
8.3.1內存洩露133 
8.3.2指針指向無效的內存單元133
8.3.3懸浮指針(也叫迷途或失控指針) 134 
8.3.4檢查使用new發出的分配請求是否得到滿足135 
8.4指針編程佳實踐137 
8.5引用是什麼137 
8.5.1是什麼讓引用很有用138 
8.5 .2將關鍵字const用於引用139 
8.5.3按引用向函數傳遞參數140 
8.6總結140 
8.7問與答141 
8.8作業142 
8.8.1測驗142 
8.8.2練習142 

第9章類和對象144 
9.1類和對象144 
9.1.1聲明類145 
9.1.2作為類實例的對象145 
9.1.3使用句點運算符訪問成員146 
9.1.4使用指針運算符(—>)訪問成員146 
9.2關鍵字public和private 147 
9.3構造函數150 
9.3.1聲明和實現構造函數150 
9.3.2何時及如何使用構造函數151 
9.3.3重載構造函數152 
9.3.4沒有默認構造函數的類154 
9.3.5帶默認值的構造函數參數155 
9.3.6包含初始化列表的構造函數156 
9.4析構函數157 
9.4.1聲明和實現析構函數157 
9.4.2何時及如何使用析構函數158
9.5複製構造函數160 
9.5.1淺複製及其存在的問題160 
9.5.2使用複制構造函數確保深複製162 
9.5.3有助於改善性能的移動構造函數166 
9.6構造函數和析構函數的其他用途166 
9.6.1不允許複製的類167 
9.6.2只能有一個實例的單例類167 
9.6.3禁止在棧中實例化的類169 
9.6.4使用構造函數進行類型轉換171 
9.7this指針172 
9.8將sizeof()用於類173 
9.9結構不同於類的地方175 
9.10聲明友元176 
9.11共用體:一種特殊的數據存儲機制178 
9.11.1聲明共用體178 
9.11.2在什麼情況下使用共用體178 
9.12對類和結構使用聚合初始化180 
9.13總結183 
9.14問與答183 
9.15作業184 
9.15.1測驗184 
9.15.2練習184 

第10章實現繼承185 
10.1繼承基礎185 
10.1.1繼承和派生186 
10.1. 2C++派生語法186 
10.1.3訪問限定符protected 188 
10.1.4基類初始化—向基類傳遞參數190
10.1.5在派生類中覆蓋基類的方法192 
10.1.6調用基類中被覆蓋的方法194 
10.1.7在派生類中調用基類的方法194 
10.1.8在派生類中隱藏基類的方法196 
10.1.9構造順序198 
10.1.10析構順序198 
10.2私有繼承200 
10.3保護繼承202 
10.4切除問題205 
10.5多繼承205 
10.6使用final禁止繼承207 
10.7總結208 
10.8問與答208 
10.9作業208 
10.9.1測驗208 
10.9.2練習209 

第11章多態210 
11.1多態基礎210 
11.1.1為何需要多態行為210 
11.1.2使用虛函數實現多態行為212 
11.1.3為何需要虛構造函數213 
11.1.4虛函數的工作原理—理解虛函數表217 
11.1.5抽象基類和純虛函數220 
11.2使用虛繼承解決菱形問題222 
11.3表明覆蓋意圖的限定符override 225 
11.4使用final來禁止覆蓋函數226 
11.5可將複製構造函數聲明為虛函數嗎227 
11.6總結230 
11.7問與答230
11.8作業231 
11.8.1測驗231 
11.8.2練習231 

第12章運算符類型與運算符重載232 
12.1C++運算符232 
12.2單目運算符233 
12.2.1單目運算符的類型233 
12.2.2單目遞增與單目遞減運算符234 
12.2.3轉換運算符236 
12.2.4解除引用運算符(*)和成員選擇運算符(—>) 238 
12.3雙目運算符239 
12.3.1雙目運算符的類型240 
12.3.2雙目加法與雙目減法運算符240 
12.3.3實現運算符+=與= 242 
12.3.4重載等於運算符(==)和不等運算符(!=) 243 
12.3.5重載運算符<、>、<=和>= 245 
12.3.6重載複製賦值運算符(=) 248 
12.3.7下標運算符250 
12.4函數運算符operator() 253 
12.5用於高性能編程的移動構造函數和移動賦值運算符254 
12.5.1不必要的複制帶來的問題254 
12.5.2聲明移動構造函數和移動賦值運算符254 
12.6用戶定義的字面量258 
12.7不能重載的運算符260 
12.8總結261 
12.9問與答261 
12.10作業261
12.10.1測驗261 
12.10.2練習261 

第13章類型轉換運算符262 
13.1為何需要類型轉換262 
13.2為何有些C++程序員不喜歡C風格類型轉換263 
13.3C++類型轉換運算符263 
13.3.1使用static_cast 263 
13.3.2使用dynamic_cast和運行階段類型識別264 
13.3.3使用reinterpret_cast 267 
13.3.4使用const_cast 267 
13.4C++類型轉換運算符存在的問題268 
13.5總結269 
13.6問與答269 
13.7作業270 
13.7.1測驗270 
13.7 .2練習270 

第14章宏和模板簡介271 
14.1預處理器與編譯器271 
14.2使用#define定義常量271 
14.3使用#define編寫宏函數274 
14.3.1為什麼要使用括號276 
14.3.2使用assert宏驗證表達式276 
14.3.3使用宏函數的優點和缺點277 
14.4模板簡介278 
14.4.1模板聲明語法278 
14.4.2各種類型的模板聲明279 
14.4.3模板函數279
14.4.4模板與類型安全281 
14.4.5模板類281 
14.4.6聲明包含多個參數的模板282 
14.4.7聲明包含默認參數的模板283 
14.4.8一個模板示例283 
14.4.9模板的實例化和具體化284 
14.4.10模板類和靜態成員286 
14.4.11參數數量可變的模板287 
14.4.12使用static_assert執行編譯階段檢查290 
14.4.13在實際C++編程中使用模板290 
14.5總結291 
14.6問與答291 
14.7作業291 
14.7.1測驗291 
14.7.2練習292 

第15章標準模板庫簡介293 
15.1STL容器293 
15.1.1順序容器293 
15.1.2關聯容器294 
15.1.3容器適配器294 
15.2STL迭代器295 
15.3 STL算法295 
15.4使用迭代器在容器和算法之間交互295 
15.5選擇正確的容器297 
15.6STL字符串類298 
15.7總結298 
15.8問與答299 
15.9作業299
 
第16章STL string類300
16.1為何需要字符串操作類300 
16.2使用STL string類301 
16.2.1實例化和復制STL string 301 
16.2.2訪問std::string的字符內容303 
16.2.3拼接字符串305 
16.2.4在string中查找字符或子字符串306 
16.2.5截短STL string 307 
16.2.6字符串反轉309 
16.2.7字符串的大小寫轉換310 
16.3基於模板的STL string實現311 
16.4總結312 
16.5問與答312 
16.6作業313 
16.6.1測驗313 
16.6.2練習313 

第17章STL動態數組類314 
17.1std::vector的特點314 
17.2典型的vector操作314 
17.2.1實例化vector 314 
17.2.2使用push_back()在末尾插入元素316 
17.2.3列表初始化317 
17.2.4使用insert()在指定位置插入元素317 
17.2.5使用數組語法訪問vector中的元素319 
17.2.6使用指針語法訪問vector中的元素320 
17.2.7刪除vector中的元素321 
17.3理解大小和容量322
17.4STLdeque類324 
17.5總結326 
17.6問與答326 
17.7作業327 
17.7.1測驗327 
17.7.2練習327 

第18章STLlist和forward_list 328 
18.1std::list的特點328 
18.2基本的list操作328 
18.2.1實例化std::list對象328 
18.2.2在list開頭或末尾插入元素330 
18.2.3在list中間插入元素331 
18.2.4刪除list中的元素333 
18.3對list中的元素進行反轉和排序334 
18.3. 1使用list::reverse()反轉元素的排列順序334 
18.3.2對元素進行排序335 
18.3.3對包含對象的list進行排序以及刪除其中的元素337 
18.3.4C++11引入的std:: forward_list 340 
18.4總結341 
18.5問與答342 
18.6作業342 
18.6.1測驗342 
18.6.2練習342 

第19章STL集合類343 
19.1簡介343 
19.2STLset和multiset的基本操作344 
19.2.1實例化std::set對象344
19.2.2在set或multiset中插入元素345 
19.2.3在STLset或multiset中查找元素347 
19.2.4刪除STLset或multiset中的元素348 
19.3使用STLset和multiset的優缺點352 
19.4總結354 
19.5問與答355 
19.6作業355 
19.6.1測驗355 
19.6.2練習355 

第20章STL映射類356 
20.1STL映射類簡介356 
20.2STLmap和multimap的基本操作357 
20.2.1實例化std::map和std::multimap 357 
20.2 .2在STLmap或multimap中插入元素358 
20.2.3在STLmap或multimap中查找元素361 
20.2.4在STLmultimap中查找元素363 
20.2.5刪除STLmap或multimap中的元素363 
20.3提供自定義的排序謂詞365 
20.4基於散列表的STL鍵—值對容器368 
20.4.1散列表的工作原理368 
20.4.2使用unordered_map和unordered_multimap 368 
20.5總結372 
20.6問與答372 
20.7作業372 
20.7.1測驗373
20.7.2練習373 

第21章理解函數對象374 
21.1函數對象與謂詞的概念374 
21.2函數對象的典型用途374 
21.2.1一元函數374 
21.2.2一元謂詞378 
21.2.3二元函數380 
21.2.4二元謂詞381 
21.3總結383 
21.4問與答384 
21.5作業384 
21.5.1測驗384 
21.5.2練習384 

第22章lambda表達式385 
22.1lambda表達式是什麼385 
22.2如何定義lambda表達式386 
22.3一元函數對應的lambda表達式386 
22.4一元謂詞對應的lambda表達式387 
22.5通過捕獲列表接受狀態變量的lambda表達式388 
22.6lambda表達式的通用語法390 
22.7二元函數對應的lambda表達式391 
22.8二元謂詞對應的lambda表達式392 
22.9總結394 
22.10問與答394 
22.11作業395 
22.11.1測驗395 
22.11.2練習395
 
第23章STL算法396 
23.1什麼是STL算法396
23.2STL算法的分類396 
23.2.1非變序算法396 
23.2.2變序算法397 
23.3使用STL算法398 
23.3.1根據值或條件查找元素398 
23.3.2計算包含給定值或滿足給定條件的元素數400 
23.3.3在集合中搜索元素或序列401 
23.3.4將容器中的元素初始化為指定值403 
23.3.5使用std::generate()將元素設置為運行階段生成的值405 
23.3.6使用for_each()處理指定範圍內的元素406 
23.3.7使用std::transform()對范圍進行變換407 
23.3.8複製和刪除操作409 
23.3.9替換值以及替換滿足給定條件的元素412 
23.3. 10排序、在有序集合中搜索以及刪除重複元素413 
23.3.11將範圍分區415 
23.3.12在有序集合中插入元素417 
23.4總結419 
23.5問與答419 
23.6作業419 
23.6.1測驗420 
23.6. 2練習420
 
第24章自適應容器:棧和隊列421 
24.1棧和隊列的行為特徵421 
24.1.1棧421 
24.1.2隊列422 
24.2使用STLstack類422
24.2.1實例化stack 422 
24.2.2stack的成員函數423 
24.2.3使用push()和pop()在棧頂插入和刪除元素424 
24.3使用STLqueue類425 
24.3.1實例化queue 425 
24.3.2queue的成員函數426 
24.3.3使用push()在隊尾插入以及使用pop()從隊首刪除427 
24.4使用STL優先級隊列428 
24.4.1實例化priority_queue類428 
24.4.2priority_queue的成員函數429 
24.4.3使用push ()在priority_queue末尾插入以及使用pop()在priority_queue開頭刪除430 
24.5總結432 
24.6問與答432 
24.7作業432 
24.7.1測驗432 
24.7.2練習432 

第25章使用STL位標誌433 
25.1bitset類433 
25.2使用std::bitset及其成員434 
25.2.1std:bitset的運算符434 
25.2.2std::bitset的成員方法435 
25.3vector<bool> 437 
25.3.1實例化vector<bool> 437 
25.3.2vector<bool>的成員函數和運算符438
25.4總結439 
25.5問與答439 
25.6作業439 
25.6.1測驗439 
25.6.2練習440
 
第26章理解智能指針441 
26.1什麼是智能指針441 
26.1.1常規(原始)指針存在的問題441 
26.1.2智能指針有何幫助442 
26.2智能指針是如何實現的442 
26.3智能指針類型443 
26.3.1深複製443 
26.3.2寫時復制機制445 
26.3.3引用計數智能指針445 
26.3.4引用鏈接智能指針445 
26.3. 5破壞性複制445 
26.3.6使用std::unique_ptr 447 
26.4深受歡迎的智能指針庫449 
26.5總結449 
26.6問與答449 
26.7作業450 
26.7.1測試450 
26.7.2練習450 

第27章使用流進行輸入和輸出451 
27.1流的概述451 
27.2重要的C++流類和流對象452 
27.3使用std::cout將指定格式的數據寫入控制台453 
27.3.1使用std::cout修改數字的顯示格式453 
27.3 .2使用std::cout對齊文本和設置字段寬度455
27.4使用std::cin進行輸入455 
27.4.1使用std::cin將輸入讀取到基本類型變量中455 
27.4.2使用std::cin:get將輸入讀取到char*緩衝區中456 
27.4. 3使用std::cin將輸入讀取到std::string中457 
27.5使用std::fstream處理文件458 
27.5.1使用open()和close()打開和關閉文件459 
27.5.2使用open()創建文本文件並使用運算符<<寫入文本460 
27.5.3使用open()和運算符>>讀取文本文件460 
27.5.4讀寫二進製文件461 
27.6使用std::stringstream對字符串進行轉換463 
27.7總結464 
27.8問與答464 
27.9作業465 
27.9.1測驗465 
27.9.2練習465 

第28章異常處理466 
28.1什麼是異常466 
28.2導致異常的原因466 
28.3使用try和catch捕獲異常467 
28.3.1使用catch (…)處理所有異常467 
28.3.2捕獲特定類型的異常468 
28.3.3使用throw引發特定類型的異常469 
28.4異常處理的工作原理470 
28.4.1std::exception類472
28.4.2從std::exception派生出自定義異常類473 
28.5總結474 
28.6問與答474 
28.7作業475 
28.7.1測驗475 
28.7.2練習475 

第29章繼續前行477 
29.1當今的處理器有何不同477 
29.2如何更好地利用多個內核478 
29.2.1線程是什麼478 
29.2.2為何要編寫多線程應用程序479 
29.2.3線程如何交換數據479 
29.2.4使用互斥量和信號量同步線程480 
29.2.5多線程技術帶來的問題480 
29.3編寫傑出的C++代碼480 
29.4C++17有望引入的新特性481 
29.4.1支持在if和switch中進行初始化481 
29.4.2保證複製得以避免482 
29.4 .3避免內存分配開銷的std::string_view 482 
29.4.4類型安全的共用體替代品std::variant 483 
29.4.5使用ifconstexpr有條件地編譯代碼483 
29.4.6改進的lambda表達式484 
29.4.7在構造函數中使用類型自動推斷功能484 
29.5更深入地學習C++ 484 
29.5.1在線文檔485 
29.5.2提供指南和幫助的社區485
29.6總結485 
29.7問與答485 
29.8作業485
 
附錄A二進制和十六進制486 
A.1十進制486 
A.2二進制486 
A.2.1計算機為何使用二進制487 
A.2.2位和字節487 
A.2.31KB相當於多少字節487 
A.3十六進制487 
A.4不同進制之間的轉換488 
A.4.1通用轉換步驟488 
A.4.2從十進制轉換為二進制488 
A.4.3從十進制轉換為十六進制489 
附錄B C++關鍵字490 
附錄C運算符優先級491 
附錄D ASCII碼492 
附錄E答案495