C 既是一門特性豐富、應(yīng)用廣泛、富有挑戰(zhàn)、值得深入學(xué)習(xí)的面向?qū)ο蟮木幊陶Z言,也是計(jì)算機(jī)相關(guān)專業(yè)必學(xué)的基礎(chǔ)課程之一。C 以C語言為基礎(chǔ),繼承了C語言高效、跨平臺(tái)的優(yōu)良特性,同時(shí)做出了極大擴(kuò)展,引入面向?qū)ο、模板泛型、函?shù)式編程、模板元編程等高級(jí)特性,讓自己成為一門與時(shí)俱進(jìn)的現(xiàn)代型高級(jí)編程語言,能夠應(yīng)對各種復(fù)雜的應(yīng)用場景,例如操作系統(tǒng)、高并發(fā)服務(wù)框架與后臺(tái)、桌面應(yīng)用、移動(dòng)開發(fā)、嵌入式開發(fā)等。當(dāng)然,正因?yàn)镃 具有諸多復(fù)雜的功能特性,從而增加了其學(xué)習(xí)成本。
C語言是C 的基礎(chǔ),是C 的子集,因此C 中的很多知識(shí)點(diǎn)都可歸于C語言,在學(xué)習(xí)C 的同時(shí),也是在學(xué)習(xí)C語言。本書開始介紹了部分C語言的基礎(chǔ)內(nèi)容,用于輔佐C 的學(xué)習(xí)。比如不太常見的關(guān)鍵字volatile、重要而易出錯(cuò)的野指針、基礎(chǔ)的分離編譯模式等,這些都是C 中最為基礎(chǔ)的知識(shí),每一名合格的程序員都應(yīng)該掌握。
本書主體內(nèi)容是圍繞C 編程語法展開的,對C 知識(shí)點(diǎn)的講解深度會(huì)略高于基礎(chǔ)教材,因此初學(xué)者在閱讀本書時(shí)要有耐心,并需結(jié)合文中代碼示例好好揣摩思考。對于有疑問的知識(shí)點(diǎn),一定要?jiǎng)邮謱?shí)踐,將自己的思考和疑問通過代碼的形式表達(dá)出來,只有這樣,才能幫助我們加深對C 晦澀知識(shí)點(diǎn)的理解。除了C 的基礎(chǔ)內(nèi)容外,本書還涉及了C
0x新標(biāo)準(zhǔn)提出的常用特性,讓讀者在學(xué)習(xí)傳統(tǒng)C 的同時(shí),對C 有一個(gè)與時(shí)俱進(jìn)的了解。比如,C
11中的關(guān)鍵字auto、就地初始化與列表初始化、Lambda表達(dá)式都是值得我們?nèi)W(xué)習(xí)和掌握的,并可將其應(yīng)用于工程實(shí)踐中。
掌握編程語言的語法知識(shí)只能保證編寫的代碼能夠編譯運(yùn)行,但是,一名成熟的C 開發(fā)人員心中必然有一把標(biāo)尺,這把標(biāo)尺就是編碼規(guī)范。初具規(guī)模的項(xiàng)目代碼不僅為了編譯和運(yùn)行,而且還要能夠長久地迭代變更、維護(hù)交接。所以,為了能夠編寫出整潔、規(guī)范、優(yōu)雅的代碼,我們應(yīng)該遵循必要的編碼規(guī)范和風(fēng)格,力爭讓自己寫出的代碼不被他人詬病。本書在參考了《Google C 編程風(fēng)格指南》并結(jié)合個(gè)人經(jīng)驗(yàn)的基礎(chǔ)上,給出了一些規(guī)范和建議,比如命名方式、頭文件使用規(guī)范與包含順序、編碼格式等建議。當(dāng)然,這些只是一家之言,僅供參考。
本書記錄的關(guān)于C 的點(diǎn)點(diǎn)滴滴,實(shí)則是自己和身邊一同求學(xué)的小伙伴對C 的學(xué)習(xí)認(rèn)知的過程,在這里分享給每一位C 從業(yè)者,希望能夠用個(gè)人的綿薄之力幫助到需要幫助的人。我相信,只要讀者潛心細(xì)讀,多讀多練,肯定能從本書中學(xué)有所得。當(dāng)然,由于個(gè)人水平有限,書中難免存在不足甚至錯(cuò)誤的地方,歡迎大家在CSDN 博客留言指正,共同探討。聯(lián)系方式可以在網(wǎng)頁搜索CSDN Dablelv。
本書從編寫到出版得到了北京航空航天大學(xué)出版社各位老師的大力支持和辛苦付出,在此深表感謝。另外,還要感謝本書的另一位作者我的大學(xué)舍友Dr.Wong,參與本書的編寫工作;感謝身邊的同學(xué)和同事在工作和生活上給予的無私幫助。最后,要感謝愛人cat在背后的默默支持與理解,以及家人的辛勞付出和母親對我的人生教誨。學(xué)習(xí)的道路并不寂寞,因?yàn)橛兄R(shí)相伴;學(xué)習(xí)的道路也不會(huì)平坦無阻,因?yàn)槟骘L(fēng)的地方更適合飛翔。
呂 呂
2018年12月
第1章 C 中的C ………………………………………………………………… 1
1.1 認(rèn)識(shí)volatile ……………………………………………………………………… 1
1.2 數(shù)組與指針詳解……………………………………………………………………
6
1.3 認(rèn)識(shí)size_t和指針類型的大小 …………………………………………………… 13
1.4 野指針…………………………………………………………………………… 16
1.5 字符數(shù)組的初始化與賦值 …………………………………………………………
18
1.6 文字常量與常變量 ……………………………………………………………… 20
1.7 數(shù)據(jù)類型寬度擴(kuò)展 ……………………………………………………………… 22
1.8 分離編譯模式簡介 ……………………………………………………………… 24
第2章 C 基礎(chǔ) …………………………………………………………………… 28
2.1 C 發(fā)展概述 …………………………………………………………………… 28
2.2 聲明與定義的區(qū)別 ……………………………………………………………… 29
2.3 認(rèn)識(shí)初始化 ………………………………………………………………………
32
2.4 結(jié)構(gòu)體的初始化與賦值…………………………………………………………… 37
2.5 認(rèn)識(shí)sizeof ……………………………………………………………………… 39
2.6 認(rèn)識(shí)const ……………………………………………………………………… 49
2.7 struct與union…………………………………………………………………… 57
2.8 多字節(jié)字符串與寬字符串的相互轉(zhuǎn)換 ……………………………………………
62
2.9 引用的本質(zhì) ………………………………………………………………………
69
2.10 鏈?zhǔn)讲僮?………………………………………………………………………
73
2.11 C 的數(shù)據(jù)類型 ……………………………………………………………… 75
2.12 數(shù)據(jù)類型轉(zhuǎn)換……………………………………………………………………
78
2.13 數(shù)值類型與string的相互轉(zhuǎn)換…………………………………………………… 91
2.14 臨時(shí)變量的常量性 ……………………………………………………………… 94
2.15 左值、右值和常引用 …………………………………………………………… 96
2.16 mutable的用法 ………………………………………………………………… 99
2.17 名字空間 ………………………………………………………………………
101
2.18 作用域與生命周期 …………………………………………………………… 107
2.19 引用計(jì)數(shù) ………………………………………………………………………
112
2.20 I/O流簡介 …………………………………………………………………… 119
2.21 頭文件的作用和用法…………………………………………………………… __________136
第3章 內(nèi)存管理…………………………………………………………………… 141
3.1 程序內(nèi)存布局……………………………………………………………………
141
3.2 堆與棧的區(qū)別……………………………………………………………………
143
3.3 new的3種面貌 ………………………………………………………………… 155
3.4 delete的3種面貌 ……………………………………………………………… 158
3.5 new與delete的使用規(guī)范 ……………………………………………………… 164
3.6 智能指針簡介……………………………………………………………………
168
3.7 STL的四種智能指針 …………………………………………………………… 172
3.8 以智能指針管理內(nèi)存資源 ………………………………………………………
188
3.9 內(nèi)存池介紹與經(jīng)典內(nèi)存池的實(shí)現(xiàn) …………………………………………………
191
第4章 函 數(shù)……………………………………………………………………… 199
4.1 關(guān)于 main()函數(shù)的幾點(diǎn)說明 …………………………………………………… 199
4.2 函數(shù)參數(shù)入棧的思考 …………………………………………………………… 202
4.3 函數(shù)調(diào)用時(shí)堆棧的變化情況 ……………………………………………………
206
4.4 如何禁止函數(shù)傳值調(diào)用 …………………………………………………………
210
4.5 函數(shù)指針簡介……………………………………………………………………
213
4.6 操作符重載 ……………………………………………………………………
215
4.7 函數(shù)重載、隱藏、覆蓋和重寫的區(qū)別
……………………………………………… 224
4.8 inline函數(shù) ……………………………………………………………………… 230
4.9 變參函數(shù) ………………………………………………………………………
235
第5章 類與對象…………………………………………………………………… 241
5.1 終結(jié)類 ………………………………………………………………………… 241
5.2 嵌套類與局部類 ………………………………………………………………… 243
5.3 純虛函數(shù)與抽象類 ……………………………………………………………… 245
5.4 臨時(shí)對象 ………………………………………………………………………
249
5.5 構(gòu)造函數(shù)體內(nèi)賦值與初始化列表的區(qū)別 …………………………………………
252
5.6 對象產(chǎn)生和銷毀的順序 …………………………………………………………
253
5.7 類成員指針 ……………………………………………………………………
254
5.8 控制對象的創(chuàng)建方式和數(shù)量 ……………………………………………………
258
5.9 仿函數(shù) ………………………………………………………………………… 263
5.10 explicit禁止構(gòu)造函數(shù)的隱式調(diào)用 ………………………………………………
267
5.11 類的設(shè)計(jì)與實(shí)現(xiàn)規(guī)范…………………………………………………………… 270
第6章 繼承與多態(tài)………………………………………………………………… 275
6.1 多態(tài)的兩種形式 ………………………………………………………………… 275
6.2 繼承與組合的區(qū)別 ……………………………………………………………… 278
6.3 基類私有成員會(huì)被繼承嗎 ………………………………………………………
282
6.4 虛擬繼承與虛基類 ……………………………………………………………… 285
6.5 typeid簡介……………………………………………………………………… 289
6.6 虛調(diào)用及其調(diào)用的具體形式 ……………………………………………………
293
6.7 動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)原理分析 …………………………………………………………
__________297
6.8 接口繼承與實(shí)現(xiàn)繼承的區(qū)別和選擇 ………………………………………………
306
6.9 獲取類成員虛函數(shù)地址 …………………………………………………………
307
6.10 構(gòu)造函數(shù)與析構(gòu)函數(shù)調(diào)用虛函數(shù)的注意事項(xiàng) ……………………………………
309
第7章 模板與泛型編程…………………………………………………………… 311
7.1 typename的雙重含義 …………………………………………………………… 311
7.2 模板實(shí)例化與調(diào)用 ……………………………………………………………… 313
7.3 模板特化與模板偏特化 …………………………………………………………
316
7.4 函數(shù)聲明對函數(shù)模板實(shí)例化的屏蔽 ………………………………………………
323
7.5 模板與分離編譯模式 …………………………………………………………… 324
7.6 endl的本質(zhì)是什么 ……………………………………………………………… 326
7.7 將模板聲明為友元 ……………………………………………………………… 330
7.8 認(rèn)識(shí)容器的迭代器 ……………………………………………………………… 334
7.9 模板元編程簡介 ………………………………………………………………… 339
第8章 C 0x初探 ……………………………………………………………… 348
8.1 新關(guān)鍵字 ………………………………………………………………………
348
8.2 基于范圍的for循環(huán) …………………………………………………………… 361
8.3 就地初始化與列表初始化 ………………………………………………………
365
8.4 Lambda表達(dá)式 ………………………………………………………………… 367
8.5 移動(dòng)語義與右值引用 …………………………………………………………… 373
8.6 POD類型 ……………………………………………………………………… 383
8.7 委托構(gòu)造函數(shù)……………………………………………………………………
388
8.8 繼承構(gòu)造函數(shù)……………………………………………………………………
390
8.9 Unicode支持 …………………………………………………………………… 394
8.10 原生字符串 ……………………………………………………………………
401
8.11 通用屬性 ………………………………………………………………………
404
8.12 變參模板 ………………………………………………………………………
407
8.13 函數(shù)模板的默認(rèn)模板參數(shù) ………………………………………………………
417
8.14 折疊表達(dá)式 ……………………………………………………………………
419
8.15 強(qiáng)類型枚舉簡介 ……………………………………………………………… 422
8.16 顯示類型轉(zhuǎn)換 ………………………………………………………………… 425
第9章 異常處理…………………………………………………………………… 427
9.1 為什么要引入異常處理機(jī)制 ……………………………………………………
427
9.2 拋出異常與傳遞參數(shù)的區(qū)別 ……………………………………………………
430
9.3 拋出和接收異常的順序 …………………………………………………………
438
9.4 構(gòu)造函數(shù)拋出異常的注意事項(xiàng)……………………………………………………
442
9.5 析構(gòu)函數(shù)禁止拋出異常 …………………………………………………………
445
9.6 使用引用捕獲異常 ……………………………………………………………… 448
9.7 棧展開如何防止內(nèi)存泄漏 ………………………………………………………
451
9.8 異常處理的開銷 ………………………………………………………………… 453
第10章 編碼規(guī)范與建議 ………………………………………………………… 456
10.1 命名方式建議 ………………………………………………………………… 456
10.2 代碼調(diào)試建議 ………………………………………………………………… 459
10.3 頭文件使用規(guī)范建議…………………………………………………………… 463
10.4 函數(shù)使用規(guī)范建議 …………………………………………………………… 469
10.5 作用域使用規(guī)范建議…………………………………………………………… ?472
10.6 類使用規(guī)范建議 ……………………………………………………………… 476
10.7 編碼格式建議 ………………………………………………………………… 485
10.8 注釋風(fēng)格建議 ………………………………………………………………… 494
10.9 特性使用建議 ………………………………………………………………… 502
參考文獻(xiàn)……………………………………………………………………………… 513__