想要徹底理解C 11和C 14,不可止步于熟悉它們引入的語言特性(例如,auto型別推導(dǎo)、移動語義、lambda表達(dá)式,以及并發(fā)支持)。挑戰(zhàn)在于高效地運(yùn)用這些特性,從而使你的軟件具備正確性、高效率、可維護(hù)性和可移植性。這正是本書意欲達(dá)成的定位。它描述的正是使用C 11和C 14(即現(xiàn)代C )來編寫真正卓越的軟件之道。涵蓋以下主題:大括號初始化、noexcept規(guī)格、完美轉(zhuǎn)發(fā),以及智能指針的make函數(shù)的優(yōu)缺點(diǎn)。std::move、std::forward、右值引用和*引用之間的聯(lián)系。編寫整潔、正確,以及高效的lambda表達(dá)式的方法。std::atomic和volatile有怎樣的區(qū)別,它們分別用于什么場合,以及它們和C 的并發(fā)API有何聯(lián)系。舊C 程序設(shè)計(即C 98)中的實(shí)戰(zhàn)要求在現(xiàn)代C 的軟件開發(fā)中作出哪些修訂。
一份宏大的作品,能夠帶動一個領(lǐng)域的蓬勃發(fā)展。C 社群在相對沉寂十?dāng)?shù)年之后迎來新一波熱潮,原因是,作為一門編程工具的*核心,C 的語言和標(biāo)準(zhǔn)庫都出現(xiàn)巨大的擴(kuò)展和強(qiáng)化。這一番大變革始自 2011,并分別在 2014、2017 持續(xù)進(jìn)化。業(yè)界習(xí)慣性地將這些新版本統(tǒng)稱為 Modern C ,用以區(qū)別傳統(tǒng)C 。作為知名書系的*作品,《Effective Modern C 》的佳質(zhì)和佳評一如其早期同門作品《Effective C 》和《More Effective C 》。本書延續(xù)作者Scott Meyers 的一貫風(fēng)格和質(zhì)量, 其*特質(zhì)就是,不但告訴我們 How,更用巨大而精良的篇幅告訴我們 Why。作者窮追猛打講究再三的勁兒,常讓我筋疲力盡,痛并快樂地爬行于某個條款之際拍案而嘆:天啊,還有下一頁!
而我,是一個在 C 領(lǐng)域已經(jīng)生活 25 年的老兵。
是的,我是一個在 C 領(lǐng)域生活了 25 年的老兵,這意味著我具備相當(dāng)?shù)?C 能力。盡管如此,面對這號稱全新語言的 Modern C ,我時或也有力不能逮、掩卷長嘆的焦躁,特別是面對 Rvalue Reference(右值引用)、Perfect Forwarding(完美轉(zhuǎn)發(fā))、Metaprogramming(元編程)、Type Deduction(類型推導(dǎo))、Type Traits(型別特征) 等艱澀主題的時候。然而正是在特別艱澀的主題上你可以領(lǐng)受本書的巨大價值:如果你想完善根基,本書是你的*選擇。這樣一本好書引介到中國,需要一位好譯者和一家好出版社。高博先生是非常用心的好譯者,技術(shù)上和文字上學(xué)養(yǎng)俱佳。我和他結(jié)緣于多年前的 emails,因著他的用功和成果, 深感此書所托得人。誠如各位所見,這是一本編排與細(xì)節(jié)俱皆上乘的出版物;我曾經(jīng)親
手編排超過 50 本書,完全知道這樣的呈現(xiàn)需要多少細(xì)瑣的步驟和細(xì)心的澆灌。本書的出版質(zhì)量足以標(biāo)示中國計算機(jī)圖書的長足進(jìn)步和精益求精。侯捷White Rock
20多年來,Scott Meyers的Effective C 叢書(包括《Effective C 》、《More Effecitve C 》和《Effective STL》)已經(jīng)為C 程序設(shè)計指南的業(yè)界設(shè)立標(biāo)桿。他清晰明了引人入勝的、對復(fù)雜技術(shù)材料進(jìn)行條分縷析的闡釋為他贏得了世界范圍內(nèi)的稱譽(yù),也使他成為一名廣受歡迎的培訓(xùn)師、咨詢顧問和會議講師。他擁有布朗大學(xué)計算機(jī)科學(xué)專業(yè)的博士學(xué)位。
出版商聲明1
致謝3
緒論7
第1章型別推導(dǎo)15
條款1:理解模板型別推導(dǎo)15
條款2:理解auto型別推導(dǎo)23
條款3:理解decltype28
條款4:掌握查看型別推導(dǎo)結(jié)果的方法35
第2章auto41
條款5:優(yōu)先選用auto,而非顯式型別聲明41
條款6:當(dāng)auto推導(dǎo)的型別不符合要求時,使用帶顯式型別的初始化物習(xí)慣用法46
第3章轉(zhuǎn)向現(xiàn)代C 52
條款7:在創(chuàng)建對象時注意區(qū)分()和{}52
條款8:優(yōu)先選用nullptr,而非0或NULL61
條款9:優(yōu)先選用別名聲明,而非typedef64
條款10:優(yōu)先選用限定作用域的枚舉型別,而非不限作用域的枚舉型別68
條款11:優(yōu)先選用刪除函數(shù),而非private未定義函數(shù)74
條款12:為意在改寫的函數(shù)添加override聲明79
條款13:優(yōu)先選用const_iterator,而非iterator85
條款14:只要函數(shù)不會發(fā)射異常,就為其加上noexcept聲明89
條款15:只要有可能使用constexpr,就使用它95
條款16:保證const成員函數(shù)的線程安全性101
條款17:理解特種成員函數(shù)的生成機(jī)制106
第4章智能指針113
條款18:使用std::unique_ptr管理具備專屬所有權(quán)的資源115
條款19:使用std::shared_ptr管理具備共享所有權(quán)的資源120
條款20:對于類似std::shared_ptr但有可能空懸的指針使用std::weak_ptr129
條款21:優(yōu)先選用std::make_unique和std::make_shared,而非直接使用new133
條款22:使用Pimpl習(xí)慣用法時,將特殊成員函數(shù)的定義放到實(shí)現(xiàn)文件中141
第5章右值引用、移動語義和完美轉(zhuǎn)發(fā)150
條款23:理解std::move和std::forward151
條款24:區(qū)分萬能引用和右值引用156
條款25:針對右值引用實(shí)施std::move,針對萬能引用實(shí)施std::forward161
條款26:避免依萬能引用型別進(jìn)行重載169
條款27:熟悉依萬能引用型別進(jìn)行重載的替代方案175
條款28:理解引用折疊187
條款29:假定移動操作不存在、成本高、未使用193
條款30:熟悉完美轉(zhuǎn)發(fā)的失敗情形196
第6章lambda表達(dá)式204
條款31:避免默認(rèn)捕獲模式205
條款32:使用初始化捕獲將對象移入閉包212
條款33:對auto&&型別的形參使用decltype,以std::forward之217
條款34:優(yōu)先選用lambda式,而非std::bind220
第7章并發(fā)API228
條款35:優(yōu)先選用基于任務(wù)而非基于線程的程序設(shè)計228
條款36:如果異步是必要的,則指定std::launch::async232
條款37:使std::thread型別對象在所有路徑皆不可聯(lián)結(jié)236
條款38:對變化多端的線程句柄析構(gòu)函數(shù)行為保持關(guān)注243
條款39:考慮針對一次性事件通信使用以void為模板型別實(shí)參的期值247
條款40:對并發(fā)使用std::atomic,對特種內(nèi)存使用volatile254
第8章微調(diào)263
條款41:針對可復(fù)制的形參,在移動成本低并且一定會被復(fù)制的前提下,考慮將
其按值傳遞263
條款42:考慮置入而非插入273