本書致力于從理論結(jié)合實戰(zhàn)的角度介紹C 的語法、標準庫以及開發(fā)環(huán)境,結(jié)合知乎網(wǎng)站等出現(xiàn)的數(shù)千個C 學習與開發(fā)問題,將面向?qū)ο蟮慕<夹g(shù)同簡單的數(shù)學建模相結(jié)合,從而同時培養(yǎng)同學分析問題、解決問題的能力。本書的例題及習題注重趣味性,并同時與要介紹的C 概念巧妙結(jié)合,從而較好闡述了C 語法概念的使用背景,使得同學們在遇到新的類似的問題時,能夠恰當?shù)睦肅 的相關(guān)概念解決問題。本教材采用的實驗環(huán)境為Microsoft Visual Studio Qt插件,該環(huán)境開發(fā)和發(fā)布的程序可以在windows、linux、android、ios、QNX、Embedded Linux等不同操作系統(tǒng)平臺及桌面和移動等不同環(huán)境運行,利用數(shù)學建模 面向?qū)ο蠼?圖形用戶界面三層模式。
(1)全國目前沒有介紹2023年*新C 國際標準的教材。(2)內(nèi)容比C 。校颍椋恚澹虻冉榻B2011年C 標準的教材更全面、更深入(3)注重實戰(zhàn)性,例題和習題來自于實戰(zhàn)開發(fā)中遇到的各種問題,能覆蓋知乎網(wǎng)站C 數(shù)千問答的內(nèi)容。(4)教材及習題配有微課視頻,例題及習題同時注重趣味性,同時具備簡單的數(shù)學建模和面向?qū)ο蟮慕!#?)采用Microsoft Visual Studio Qt插件,兩者均能用于開發(fā)和發(fā)布windows、linux、andriod及ios等不同操作系統(tǒng)平臺下的軟件。
在AT&T貝爾實驗室工作期間,本賈尼·斯特勞斯特盧普(Bjarne Stroustrup)于1983年開發(fā)了C 。在C語言的基礎(chǔ)上,通過數(shù)據(jù)封裝來減小程序變量的副作用,引入繼承、聚合等軟件重用機制開發(fā)了C ,以便程序員提高軟件設(shè)計、開發(fā)和維護的效率。C 是目前系統(tǒng)及應用程序開發(fā)應用較為廣泛的語言,具備了面向?qū)ο蟪绦蛟O(shè)計語言的幾乎全部特點。學習C 的標準類庫只能提高讀者的算法設(shè)計能力,而理解核心概念才真正有助于C 的入門和提高。核心概念的掌握有助于初學者快速發(fā)現(xiàn)和改正程序中的錯誤,有助于學成者更好地進行系統(tǒng)模型的分析和設(shè)計。學習完C 后,若還體會不到面向?qū)ο蟪绦蛟O(shè)計的優(yōu)點,不會分析問題、建立模型及進行軟件模塊的設(shè)計開發(fā),那就違背了本賈尼·斯特勞斯特盧普開發(fā)C 的初衷。本書強調(diào)C 核心概念和基礎(chǔ)理論的掌握,由淺入深地逐步展開和介紹C 的全部概念。所有概念均以實例介紹其使用背景及注意事項,便于讀者學以致用、融會貫通以及舉一反三。前面章節(jié)盡量避免引用后面章節(jié)的概念,為了方便讀者步步為營地區(qū)分和理解新概念,我們借助棧和隊列等熟知案例逐步導入新概念,在逐步鑒賞中強化學習效果并徹底理解和掌握C 。本書可作為程序設(shè)計語言教學改革的教材,內(nèi)容涵蓋匯編語言、C語言程序設(shè)計、C 程序設(shè)計三門課程。通過將C 程序編譯為相應的匯編程序,展示了函數(shù)重載、值參傳遞、函數(shù)返回等實現(xiàn)細節(jié),有助于讀者從底層理解重載、指針、引用等相關(guān)概念,有助于讀者深刻把握面向?qū)ο笏枷爰捌鋵崿F(xiàn)原理、穩(wěn)固地建立基礎(chǔ)進而能夠獨立地解決編程問題。本書全面系統(tǒng)地介紹了C 的*新國際標準,包括進制轉(zhuǎn)換、常量、變量、指針、引用、左值、右值、表達式、語句、循環(huán)、函數(shù)、線程、重載、類、內(nèi)聯(lián)、對象、構(gòu)造、析構(gòu)、封裝、友元、繼承、聚合、隱藏、覆蓋、綁定、多態(tài)、實例成員、靜態(tài)成員、成員指針、虛函數(shù)、純虛函數(shù)、抽象類、虛基類、生命期、作用域、模板、模塊、接口、概念、約束、協(xié)程、泛型、異常、斷言、名字空間、移動語義、運算符重載、Lambda表達式、結(jié)構(gòu)化綁定、類型推導、類型標識、類型轉(zhuǎn)換、類型展開、省略類型參數(shù)、類型表達式解析、對象內(nèi)存布局、流及標準類庫等知識。為了便于讀者自學,本書通過二維碼提供微課視頻,對教材中的難點進行重點講解,并給出相關(guān)概念的完整程序?qū)嵗。為了讓讀者掌握面向?qū)ο蟮姆治、設(shè)計及編程方法,微課視頻中完整展示了骰子游戲面向?qū)ο蟮姆治黾敖_^程,并用C 進行了面向?qū)ο蟮某绦蛟O(shè)計。除了豐富的例題和習題外,*后一章的作業(yè)可用于綜合實驗和課程設(shè)計,能夠提高讀者數(shù)學建模及面向?qū)ο蟮慕Ec設(shè)計能力,提升基于三層模式開發(fā)圖形用戶界面應用的水平。本書推薦使用Microsoft Visual Studio 2019編譯環(huán)境,它是C *為普及易用的開發(fā)環(huán)境,幾乎支持C 標準文本的全部標準,擁有豐富的類庫及友好的編輯、編譯、調(diào)試及發(fā)布界面,本書所有例子都在該編譯環(huán)境中進行了測試。本書將提供電子教案、教學指導、習題解答、實例代碼等教輔資料。本書還將提供實驗自動測試與評分程序,它能檢測是否按面向?qū)ο蟮乃枷刖幊,并能給予適當?shù)木幊讨笇Ш徒ㄗh。在華中科技大學連續(xù)多年C 教學的基礎(chǔ)上,編者認真聽取了在讀生與畢業(yè)生的寶貴意見,力求全面完整地介紹C 的*新國際標準內(nèi)容,盡量給出完整實用的程序設(shè)計實例,避免讀者翻閱多種教學參考資料,盡量減少相關(guān)概念前后和交叉引用,例題盡量反映概念的實際應用背景。在此筆者向他們表示誠摯的謝意。對于本書存在的疏漏和不足,誠懇地希望廣大讀者批評指正。馬光志2022年12月于華中科技大學
馬光志,湖北鐘祥人,博士,副教授。1985在大連理工大學獲計算機軟件學士學位,1988年在華中科技大學獲計算機軟件碩士學位,2009年獲華中科技大學計算機軟件博士學位,1997、2011年先后在美國North Illinois University、Kennesaw State University培訓及訪問。主要研究方向為人工智能、圖像處理、深度學習,曾發(fā)表國際期刊SCI論文25篇、國際會議發(fā)表論文10篇,國內(nèi)期刊會議論文30篇,出版教材5部,獲得授權(quán)發(fā)明專利1項,獲得6項軟件著作版權(quán)。主持與參加了近30個研究開發(fā)項目,包括國家自然科學基金1項,省自然科學基金1項,國家863及973共4項,國家重大研發(fā)計劃1項,中英國際合作及中加國際合作項目各1項,上海聯(lián)影橫向合作項目4項,以及與醫(yī)學圖像、醫(yī)院信息、衛(wèi)生監(jiān)管等相關(guān)的多個研究開發(fā)項目8項。曾參加C語言至8086匯編語言編譯器的研究與開發(fā)項目。獲得中國醫(yī)院科技創(chuàng)新獎1次,湖北省科技進步二等獎2次、三等獎1次。講授的課程主要包括數(shù)據(jù)開采與知識發(fā)現(xiàn)、面向?qū)ο蟪绦蛟O(shè)計、C 程序設(shè)計、Java程序設(shè)計、匯編語言程序設(shè)計,Lisp語言,Prolog語言,數(shù)據(jù)結(jié)構(gòu)等。
第1章 C 引論 1
1.1 計算機的體系結(jié)構(gòu) 1
1.1.1 計算機系統(tǒng)的體系結(jié)構(gòu) 1
1.1.2 數(shù)據(jù)與機器指令的解析 3
1.2 進制及其轉(zhuǎn)換和運算 5
1.2.1 計算機采用二進制的原因 5
1.2.2 C 的常用進制及其運算 6
1.3 80x86系列匯編語言 8
1.3.1 匯編語言及C 編譯簡介 8
1.3.2 匯編指令及C 程序編譯 9
1.4 C 的發(fā)展歷史及特點 13
1.4.1 C 的發(fā)展歷史 14
1.4.2 C 的特點 14
1.5 語法圖與程序流程圖 15
1.5.1 C 的語法圖 15
1.5.2 程序流程圖 17
1.6 編譯環(huán)境的安裝與使用 18
1.6.1 編譯過程及編譯環(huán)境 19
1.6.2 Microsoft Visual Studio 2019的安裝 19
練習題 26
第2章 類型、常量及變量 27
2.1 C 的單詞 27
2.1.1 C 的字符集 27
2.1.2 C 的關(guān)鍵字 28
2.2 預定義類型及值域和常量 29
2.2.1 預定義類型及其數(shù)值轉(zhuǎn)換 29
2.2.2 強制類型轉(zhuǎn)換及類型值域 31
2.2.3 預定義類型及相關(guān)常量 33
2.3 變量及其類型解析 37
2.3.1 變量的聲明和定義 38
2.3.2 指針及其類型理解 41
2.3.3 有址引用變量 49
2.3.4 無址引用變量 55
2.3.5 元素、下標及數(shù)組 57
2.4 運算符及表達式 60
2.4.1 位運算與等號運算 60
2.4.2 指針運算及其結(jié)合方向 61
2.4.3 關(guān)系運算及結(jié)果轉(zhuǎn)換 62
2.5 結(jié)構(gòu)與聯(lián)合 64
2.5.1 結(jié)構(gòu)體 64
2.5.2 聯(lián)合體 66
練習題 68
第3章 語句、函數(shù)及程序設(shè)計 70
3.1 C 的語句 70
3.1.1 簡單語句 70
3.1.2 轉(zhuǎn)移語句 71
3.1.3 分支語句及分支預選 73
3.1.4 循環(huán)語句 76
3.1.5 break和continue語句 80
3.1.6 asm和static_assert語句 81
3.2 C 的函數(shù) 82
3.2.1 函數(shù)聲明與定義 82
3.2.2 頭文件與聲明 84
3.2.3 函數(shù)的參數(shù)聲明 86
3.2.4 函數(shù)重載 88
3.2.5 inline、constexpr及consteval函數(shù) 90
3.2.6 線程互斥及線程本地變量 94
3.3 作用域 95
3.3.1 全局作用域與文件作用域 95
3.3.2 局部作用域與塊作用域 97
3.4 生命期 99
3.5 程序設(shè)計實例 101
3.5.1 棧編程實例 101
3.5.2 隊列編程實例 103
3.5.3 有限自動機編程實例 105
練習題 108
第4章 C 的類 110
4.1 類的聲明及定義 110
4.1.1 面向?qū)ο蟮幕靖拍?110
4.1.2 類及對象定義的實例 111
4.2 成員訪問權(quán)限及突破方法 115
4.2.1 成員的訪問權(quán)限 116
4.2.2 突破成員的訪問權(quán)限 117
4.3 內(nèi)聯(lián)、匿名類及位域 118
4.3.1 函數(shù)成員的內(nèi)聯(lián) 118
4.3.2 無對象的靜態(tài)匿名聯(lián)合 119
4.3.3 局部類及位域成員 121
4.4 new和delete運算符 122
4.4.1 簡單類型及單個對象內(nèi)存管理 122
4.4.2 復雜類型及對象數(shù)組內(nèi)存管理 124
4.5 隱含參數(shù)this 126
4.6 對象的構(gòu)造與析構(gòu) 128
4.6.1 構(gòu)造函數(shù)及對象初始化 128
4.6.2 成員默認值及構(gòu)造與析構(gòu) 130
4.7 類及對象的內(nèi)存布局 132
練習題 135
第5章 成員及成員指針 137
5.1 實例成員指針 137
5.1.1 實例成員指針的用法 137
5.1.2 實例成員指針的限制 139
5.2 const、volatile和mutable 140
5.2.1 const和volatile的用法 140
5.2.2 mutable實例數(shù)據(jù)成員 144
5.3 靜態(tài)數(shù)據(jù)成員 146
5.3.1 靜態(tài)數(shù)據(jù)成員的用法 146
5.3.2 靜態(tài)數(shù)據(jù)成員的限制 149
5.4 靜態(tài)函數(shù)成員 151
5.4.1 靜態(tài)函數(shù)成員的訪問 151
5.4.2 靜態(tài)函數(shù)成員的限制 152
5.5 靜態(tài)成員指針 153
5.5.1 靜態(tài)成員指針的用法 153
5.5.2 多種指針的混合用法 154
5.6 聯(lián)合的成員指針 155
練習題 157
第6章 繼承與構(gòu)造 160
6.1 單繼承類 160
6.2 繼承方式 162
6.2.1 繼承后成員的訪問權(quán)限 162
6.2.2 訪問權(quán)限的修改 165
6.3 成員訪問及其指針 166
6.4 構(gòu)造與析構(gòu) 168
6.4.1 對象構(gòu)造的執(zhí)行順序 168
6.4.2 new、delete引起的構(gòu)造與析構(gòu) 169
6.5 父類與子類 170
6.5.1 父類及其函數(shù)調(diào)用 170
6.5.2 友元和派生類函數(shù)中的父子類關(guān)系 172
6.6 派生類的內(nèi)存布局 174
練習題 175
第7章 可訪問性 178
7.1 作用域運算符 178
7.1.1 面向?qū)ο蟮淖饔糜?178
7.1.2 面向過程的作用域 181
7.2 名字空間 182
7.2.1 名字空間的基本用法 182
7.2.2 使用名字空間的注意事項 185
7.3 成員友元 187
7.3.1 成員友元的一般用法 188
7.3.2 互為依賴的類的友元 189
7.4 普通友元及其注意事項 190
7.4.1 普通友元的一般用法 191
7.4.2 友元使用的注意事項 193
7.5 覆蓋與隱藏 195
7.5.1 覆蓋與隱藏的用法 195
7.5.2 使用using避免數(shù)據(jù)成員覆蓋 196
7.6 同體與異體 198
練習題 199
第8章 多態(tài)與虛函數(shù) 203
8.1 虛函數(shù) 203
8.1.1 虛函數(shù)的聲明及定義 203
8.1.2 虛函數(shù)的重載及內(nèi)聯(lián) 205
8.2 虛析構(gòu)函數(shù) 209
8.3 類的引用 210
8.3.1 類的引用變量及其析構(gòu) 211
8.3.2 類的引用參數(shù)及其析構(gòu) 213
8.4 抽象類 217
8.4.1 抽象類的定義及用法 217
8.4.2 抽象類的應用實例 218
8.5 虛函數(shù)友元與晚期綁定 221
8.5.1 虛函數(shù)作為友元 221
8.5.2 虛函數(shù)的晚期綁定 222
8.6 有虛函數(shù)時的內(nèi)存布局 223
練習題 225
第9章 多繼承與虛基類 227
9.1 多繼承類 227
9.1.1 無多繼承的替代方案 227
9.1.2 多繼承存在的問題 228
9.2 虛基類 230
9.3 派生類成員 232
9.3.1 無虛基類時的成員同名 232
9.3.2 有虛基類時的成員同名 233
9.4 單重及多重繼承的構(gòu)造與析構(gòu) 234
9.4.1 單繼承的構(gòu)造與析構(gòu) 234
9.4.2 多繼承的構(gòu)造與析構(gòu) 236
9.5 多繼承類的內(nèi)存布局 237
9.5.1 無虛基類時的內(nèi)存布局 237
9.5.2 有虛基類時的內(nèi)存布局 239
練習題 242
第10章 異常與斷言 245
10.1 異常處理 245
10.1.1 拋出與捕獲 245
10.1.2 異常的傳播 247
10.2 捕獲順序 248
10.3 函數(shù)的異常接口 249
10.3.1 異常接口聲明 250
10.3.2 noexcept接口 251
10.4 異常類型 253
10.5 異常對象的析構(gòu) 254
10.5.1 通過對象指針析構(gòu) 254
10.5.2 未完成對象的析構(gòu) 256
10.6 斷言 257
練習題 259
第11章 運算符重載 260
11.1 運算符概述 260
11.1.1 結(jié)果為左值的運算符 260
11.1.2 運算符重載的分類 261
11.1.3 成員重載與非成員重載 262
11.2 運算符參數(shù) 263
11.2.1 自增與自減的重載 264
11.2.2 重載運算符-> 265
11.2.3 單雙目運算符的重載 266
11.3 賦值與調(diào)用 268
11.3.1 賦值運算符的重載 268
11.3.2 構(gòu)造函數(shù)的重載 271
11.3.3 安全的編程方法 272
11.4 類型轉(zhuǎn)換與內(nèi)存管理 273
11.4.1 單個顯式參數(shù)構(gòu)造函數(shù) 274
11.4.2 強制類型轉(zhuǎn)換重載函數(shù) 275
11.4.3 重載new和delete 276
11.5 重載<=>、[]及文本運算符 278
11.5.1 重載<=>運算符 278
11.5.2 重載[]運算符 280
11.5.3 重載文本運算符 281
11.6 運算符重載實例 282
11.6.1 符號表運算的重載實例 282
11.6.2 棧及隊列運算重載實例 284
練習題 289
第12章 類型解析、轉(zhuǎn)換與推導 295
12.1 隱式與顯式類型轉(zhuǎn)換 295
12.1.1 簡單類型的隱式轉(zhuǎn)換 295
12.1.2 簡單類型的顯式轉(zhuǎn)換 297
12.1.3 簡單類型的轉(zhuǎn)換結(jié)果 298
12.2 cast系列類型轉(zhuǎn)換 302
12.2.1 static_cast靜態(tài)轉(zhuǎn)換 302
12.2.2 const_cast只讀轉(zhuǎn)換 303
12.2.3 dynamic_cast動態(tài)轉(zhuǎn)換 306
12.2.4 reinterpret_cast重釋轉(zhuǎn)換 310
12.3 類型轉(zhuǎn)換實例 312
12.3.1 typeid獲取類型標識 313
12.3.2 explicit要求顯式調(diào)用 314
12.3.3 棧的類型轉(zhuǎn)換實例 316
12.4 自動類型推導 318
12.4.1 auto的一般用法 319
12.4.2 auto用于函數(shù)、數(shù)組、列表和結(jié)構(gòu) 320
12.4.3 表達式類型的提取decltype 322
12.5 Lambda表達式 324
12.5.1 Lambda表達式的聲明 324
12.5.2 Lambda表達式的參數(shù) 327
12.5.3 準函數(shù)Lambda表達式 331
練習題 334
第13章 模板、模塊、概念、協(xié)程 335
13.1 變量模板及其實例 335
13.1.1 變量模板的定義 335
13.1.2 變量模板的實例化 336
13.2 函數(shù)模板 337
13.2.1 函數(shù)模板的定義 337
13.2.2 成員函數(shù)模板的定義 339
13.2.3 可變類型參數(shù)及折疊表達式 340
13.3 函數(shù)模板實例化 343
13.3.1 函數(shù)模板強制實例化 343
13.3.2 函數(shù)模板實例特化 344
13.3.3 涉及指針的模板實例化 345
13.4 類模板及模板別名 346
13.4.1 類模板及模板別名定義 346
13.4.2 派生類類模板的定義 347
13.4.3 多類型參數(shù)的類模板 348
13.4.4 省略參數(shù)的類模板 349
13.4.5 類模板的友元及Lambda表達式 351
13.5 類模板的實例化及特化 354
13.5.1 類模板的實例化 354
13.5.2 類模板實例特化 354
13.5.3 類模板的部分特化 357
13.5.4 實例化與類型推導 359
13.5.5 類模板及實例成員指針 360
13.5.6 模板分隔符的二義性 361
13.5.7 類模板與泛型 362
13.6 模塊、概念、協(xié)程 366
13.6.1 模塊及分區(qū) 366
13.6.2 概念及約束 368
13.6.3 協(xié)程及編譯配置 371
13.6.4 智能指針及內(nèi)存回收 376
練習題 379
第14章 流及標準類庫 381
14.1 流類概述 381
14.2 輸出流 382
14.3 輸入流 385
14.4 文件流 386
14.5 串流處理 388
14.6 函數(shù)模板format 389
14.7 標準類庫的容器 390
14.8 類型特征type_traits 393
練習題 396
第15章 面向?qū)ο箝_發(fā)實例 397
15.1 面向?qū)ο笤O(shè)計概述 397
15.2 對象的靜態(tài)模型 398
15.3 面向?qū)ο蟮姆治?400
15.4 對象的設(shè)計與實現(xiàn) 401
15.5 骰子游戲模型設(shè)計實例 403
15.5.1 問題描述 403
15.5.2 對象模型 404
15.5.3 對象設(shè)計 405
15.6 游戲模型程序設(shè)計 408
練習題 414
參考文獻 422