[美] 斯科特·邁耶(Scott Meyers) 著,高博 譯
想要徹底理解C++11和C++14,不可止步于熟悉它們引入的語言特性(例如,auto型別推導(dǎo)、移動(dòng)語義、lambda表達(dá)式,以及并發(fā)支持)。挑戰(zhàn)在于高效地運(yùn)用這些特性,從而使你的軟件具備正確性、高效率、可維護(hù)性和可移植性。這正是本書意欲達(dá)成的定位。它描述的正是使用C++11和C++14(即現(xiàn)代C++)來編寫真正卓越的軟件之道。
本書沿用了Scott Meyers早期作品中業(yè)已證明的基于指導(dǎo)原則和實(shí)例驅(qū)動(dòng)的格式,但介紹的是全新材料。本書是所有C++軟件開發(fā)工程師的必讀之選。
涵蓋以下主題:
大括號(hào)初始化、noexcept規(guī)格、完美轉(zhuǎn)發(fā),以及智能指針的make函數(shù)的優(yōu)缺點(diǎn)。
std::move、std::forward、右值引用和萬能引用之間的聯(lián)系。
編寫整潔、正確,以及高效的lambda表達(dá)式的方法。
std::atomic和volatile有怎樣的區(qū)別,它們分別用于什么場(chǎng)合,以及它們和C++的并發(fā)API有何聯(lián)系。
“舊”C++程序設(shè)計(jì)(即C++98)中的實(shí)戰(zhàn)要求在現(xiàn)代C++的軟件開發(fā)中作出哪些修訂。
20多年來,Scott Meyers的Effective C++叢書(包括《Effective C++》、《More Effecitve C++》和《Effective STL》)已經(jīng)為C++程序設(shè)計(jì)指南的業(yè)界設(shè)立標(biāo)桿。他清晰明了引人入勝的、對(duì)復(fù)雜技術(shù)材料進(jìn)行條分縷析的闡釋為他贏得了世界范圍內(nèi)的稱譽(yù),也使他成為一名廣受歡迎的培訓(xùn)師、咨詢顧問和會(huì)議講師。他擁有布朗大學(xué)計(jì)算機(jī)科學(xué)專業(yè)的博士學(xué)位。
“學(xué)會(huì)了C++基礎(chǔ)知識(shí)以后,是Scott Meyers的Effective C++叢書教會(huì)了我如何在產(chǎn)品代碼中運(yùn)用C++。本書是具有重要性的一本學(xué)習(xí)手冊(cè),它給你關(guān)于核心指導(dǎo)原則、程序設(shè)計(jì)風(fēng)格和習(xí)慣用法方面的建議,使你能夠高效地、適當(dāng)?shù)厥褂矛F(xiàn)代C++。手頭還沒有一本這樣的書嗎?就買這本,就趁現(xiàn)在!”
——Herb Sutter
C++標(biāo)準(zhǔn)委員會(huì)主席,微軟公司C++軟件架構(gòu)師
對(duì) C 還有愛嗎?理應(yīng)如此!現(xiàn)代 C (即 C 11/C 14)遠(yuǎn)不止是修修補(bǔ)補(bǔ)。考 慮所有的新功能,這簡(jiǎn)直是一門語言的脫胎換骨。你在尋求指導(dǎo)和幫助嗎?那么本書 肯定就是你想找的。關(guān)于 C ,Scott Meyers 一直是精確、質(zhì)量和驚喜的代名詞。
——Gerhard Kreuzer,西門子股份公司研發(fā)工程師
精深的專業(yè)人士很難尋覓。完美主義的傳道授業(yè)——講求策略和言簡(jiǎn)意賅的作者也是 一人難求。當(dāng)你發(fā)現(xiàn)兩者體現(xiàn)在同一個(gè)人身上時(shí),你知道你找到的會(huì)是一種享受?!禘ffective Modern C 》是一位完美的技術(shù)作家高山仰止的成就。它在錯(cuò)綜復(fù)雜、 相互聯(lián)系的話題之間游走,條分縷析地、意義明確地、井井有條地進(jìn)行了闡明,而所 有這些都在洗練的文筆中娓娓道來。你不太可能在《Effective Modern C 》中找到技術(shù)錯(cuò)誤,枯燥段落,甚至偷懶的詞句。
——Andrei Alexandrescu 博士,F(xiàn)acebook 研究科學(xué)家,《Modern C Design》作者
作為擁有超過 20 年 C 經(jīng)驗(yàn)的人,為了充分利用現(xiàn)代 C (既要習(xí)得*實(shí)踐,又 要避免各種陷阱),我強(qiáng)烈建議你閱讀本書、徹底閱讀本書,并經(jīng)常參考它!當(dāng)然,我從本書中學(xué)到了很多新知識(shí)!
——Nevin Liber DRW,交易集團(tuán)公司高級(jí)軟件工程師
C 的締造者 Bjarne Stroustrup 如是說:“C 11 感覺像是一種新的語言。”
《Effective Modern C 》使得我們能夠清楚地向日常使用 C 的軟件工程師解釋, 如何從 C 11/C 14 的新特性和習(xí)慣用法中受益,并和他們產(chǎn)生共鳴。
Scott Meyers 出品,必屬精品!
——Cassio Neri FX 定量分析師,勞埃德銀行集團(tuán)
Scott 掌握了從復(fù)雜性中抽出容易理解的內(nèi)核這個(gè)竅門。他的 Effective C 叢書有助 于改善上一代 C 程序員的程序設(shè)計(jì)風(fēng)格,而這本新書似乎定位于為使用現(xiàn)代 C 的人做同樣的事情。
—— Roger Orr OR/2 有限公司,ISO C 標(biāo)準(zhǔn)委員會(huì)成員
《Effective Modern C 》是提高你的現(xiàn)代 C 技能的上佳工具。它不僅教會(huì)你如何 使用、何時(shí)何地使用現(xiàn)代 C ,而且還是有效地使用。它還解釋了背后的原因何在。 毫無疑問,Scott 清晰而有見地的文字分布在 42 個(gè)經(jīng)過精心思考的條款上,使得程序員能夠更好地理解這門語言。
—— Bart Vandewoestyne,研發(fā)工程師,C 愛好者
我喜歡 C ,幾十年來它一直是我在工作中使用的工具。而且,它的*特性比我以 前想像的更強(qiáng)大、更富有表現(xiàn)力。但是,所有這些選擇都帶來了一個(gè)問題: “何時(shí)以及如何應(yīng)用這些特性呢?”如以往一樣,Scott 的Effective C 叢書是這個(gè)問題的明確答案。
—— Damien Watkins CSIRO,計(jì)算軟件工程組組長(zhǎng)
這是一本關(guān)于過渡到現(xiàn)代 C 的上佳讀物,新的 C 11/14 語言特性被和 C 98 參照著描述,主題條款很容易參讀,并且在每個(gè)部分末尾都給出了總結(jié)性建議。 無論對(duì)于入門還是高級(jí)的 C 開發(fā)工程師,本書都既有娛樂性又有實(shí)用性。
—— Rachel Cheng,F(xiàn)5 網(wǎng)絡(luò)
如果你正在從 C 98/03 遷移至 C 11/14,則肯定需要 Scott 在《Effective Modern C 》中提供的極其實(shí)用而清晰的信息。如果你已經(jīng)在撰寫 C 11 代碼, 那么可能會(huì)通過 Scott 針對(duì)該語言的主要新功能的深入討論來發(fā)現(xiàn)新功能的問題 所在。無論你的情況屬于哪一種,本書*值得你為閱讀而付出的時(shí)間。
—— Rob Stewart Boost Steering,委員會(huì)成員(boost.org)
目錄
出版商聲明 1
致謝 3
緒論 7
第1章 型別推導(dǎo) 15
條款1:理解模板型別推導(dǎo) 15
條款2:理解auto型別推導(dǎo) 23
條款3:理解decltype 28
條款4:掌握查看型別推導(dǎo)結(jié)果的方法 35
第2章 auto 41
條款5:優(yōu)先選用auto,而非顯式型別聲明 41
條款6:當(dāng)auto推導(dǎo)的型別不符合要求時(shí),使用帶顯式型別的初始化物習(xí)慣用法 46
第3章 轉(zhuǎn)向現(xiàn)代C++ 52
條款7:在創(chuàng)建對(duì)象時(shí)注意區(qū)分()和{} 52
條款8:優(yōu)先選用nullptr,而非0或NULL 61
條款9:優(yōu)先選用別名聲明,而非typedef 64
條款10:優(yōu)先選用限定作用域的枚舉型別,而非不限作用域的枚舉型別 68
條款11:優(yōu)先選用刪除函數(shù),而非private未定義函數(shù) 74
條款12:為意在改寫的函數(shù)添加override聲明 79
條款13:優(yōu)先選用const_iterator,而非iterator 85
條款14:只要函數(shù)不會(huì)發(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:對(duì)于類似std::shared_ptr但有可能空懸的指針使用std::weak_ptr 129
條款21:優(yōu)先選用std::make_unique和std::make_shared,而非直接使用new 133
條款22:使用Pimpl習(xí)慣用法時(shí),將特殊成員函數(shù)的定義放到實(shí)現(xiàn)文件中 141
第5章 右值引用、移動(dòng)語義和完美轉(zhuǎn)發(fā) 150
條款23:理解std::move和std::forward 151
條款24:區(qū)分萬能引用和右值引用 156
條款25:針對(duì)右值引用實(shí)施std::move,針對(duì)萬能引用實(shí)施std::forward 161
條款26:避免依萬能引用型別進(jìn)行重載 169
條款27:熟悉依萬能引用型別進(jìn)行重載的替代方案 175
條款28:理解引用折疊 187
條款29:假定移動(dòng)操作不存在、成本高、未使用 193
條款30:熟悉完美轉(zhuǎn)發(fā)的失敗情形 196
第6章 lambda表達(dá)式 204
條款31:避免默認(rèn)捕獲模式 205
條款32:使用初始化捕獲將對(duì)象移入閉包 212
條款33:對(duì)auto&&型別的形參使用decltype,以std::forward之 217
條款34:優(yōu)先選用lambda式,而非std::bind 220
第7章 并發(fā)API 228
條款35:優(yōu)先選用基于任務(wù)而非基于線程的程序設(shè)計(jì) 228
條款36:如果異步是必要的,則指定std::launch::async 232
條款37:使std::thread型別對(duì)象在所有路徑皆不可聯(lián)結(jié) 236
條款38:對(duì)變化多端的線程句柄析構(gòu)函數(shù)行為保持關(guān)注 243
條款39:考慮針對(duì)一次性事件通信使用以void為模板型別實(shí)參的期值 247
條款40:對(duì)并發(fā)使用std::atomic,對(duì)特種內(nèi)存使用volatile 254
第8章 微調(diào) 263
條款41:針對(duì)可復(fù)制的形參,在移動(dòng)成本低并且一定會(huì)被復(fù)制的前提下,考慮將
其按值傳遞 263
條款42:考慮置入而非插入 273
更多建議: