經過一年的編寫,這本書終於和大家見面了, 已經由機械工業出版社出版,希望本書能給學習C++尤其是C++11的朋友們更多的幫助。
在StackOverflow的最近一次世界性調查中,C++11在所有的編程語言中排名第二, C++11受到程序員的追捧是毫不意外的,因為它就像C++之父Bjarne Stroustrup說的:它看起來就像一門新的語言。C++11新增加了相當多的現代編程語言的特性,相比C++98/03,它在生產力、安全性、性能和易用性上都有了大幅提高。比如auto和decltype讓我們從書寫冗長的類型和繁瑣的類型推斷中解脫出來,智能指針讓我們再也不用擔心內存洩漏的問題,右值引用避免了無謂的臨時對象拷貝,type_traits和可以變模板參數讓我們可以更方便地寫更加泛化的代碼……這些還只是新增的一百多項新特性中的一小部分而已。C++14的標准在2014年的時候已經確定,而C++17標准正在制定當中,可以預見的未來,C++的發展會越來越好,C++的應用會越來越廣泛,也會更受廣大開發者地歡迎。
本書的內容來源於C++11項目實踐,寫作此書的目的是為了和廣大讀者分享學習和應用C++11的經驗和樂趣。本書分為兩篇,第一篇主要是介紹一些常用的C++11特性,介紹這些特性是如何優化C++11以前的一些代碼的,讀者可以從中更深刻地領悟這些新特性;第二篇主要是一些實際開發中的典型應用案例,通過這些案例讀者可以看到C++11的這些新特性是如何綜合運用於實際開發中的,具有實踐的指導作用。相信本書會成為讀者學習和應用C++11的良師益友。
主要介紹了C++11中最常用新特性,從程序簡潔性、性能、代碼質量、內存洩露、多線程等多方面給出了代碼優化的方法和建議。 深入講解了C++11在線程池開發、流行框架和庫(如AOP、IOC和Linq)的開發、庫的封裝等各種工程級項目中的應用,包含大量實現源碼。具體的目錄如下(展開下面的節點即可看完整目錄):
前言 第一篇 C++11改進我們的程序 第1章 使用C++11讓程序更簡潔、更現代 2 1.1 類型推導 2 1.1.1 auto類型推導 2 1.1.2 decltype關鍵字 9 1.1.3 返回類型後置語法——auto和decltype的結合使用 14 1.2 模板的細節改進 16 1.2.1 模板的右尖括號 16 1.2.2 模板的別名 18 1.2.3 函數模板的默認模板參數 20 1.3 列表初始化 22 1.3.1 統一的初始化 23 1.3.2 列表初始化的使用細節 25 1.3.3 初始化列表 29 1.3.4 防止類型收窄 32 1.4 基於范圍的for循環 34 1.4.1 for循環的新用法 34 1.4.2 基於范圍的 for循環的使用細節 36 1.4.3 讓基於范圍的 for循環支持自定義類型 40 1.5 std::function和bind綁定器 47 1.5.1 可調用對象 47 1.5.2 可調用對象包裝器——std::function 49 1.5.3 std::bind綁定器 52 1.6 lambda表達式 56 1.6.1 lambda表達式的概念和基本用法 56 1.6.2 聲明式的編程風格,簡潔的代碼 59 1.6.3 在需要的時間和地點實現閉包,使程序更靈活 60 1.7 tupe元組 61 1.8 總結 63 第2章 使用C++11改進程序性能 64 2.1 右值引用 64 2.1.1 &&的特性 65 2.1.2 右值引用優化性能,避免深拷貝 71 2.2 move語義 77 2.3 forward和完美轉發 78 2.4 emplace_back減少內存拷貝和移動 81 2.5 unordered container無序容器 83 2.6 總結 85 第3章 使用C++11消除重復,提高代碼質量 86 3.1 type_traits——類型萃取 86 3.1.1 基本的type_traits 87 3.1.2 根據條件選擇的traits 96 3.1.3 獲取可調用對象返回類型的traits 96 3.1.4 根據條件禁用或啟用某種或某些類型traits 99 3.2 可變參數模板 103 3.2.1 可變參數模板函數 103 3.2.2 可變參數模板類 107 3.2.3 可變參數模板消除重復代碼 111 3.3 可變參數模版和type_taits的綜合應用 114 3.3.1 optional的實現 114 3.3.2 惰性求值類lazy的實現 118 3.3.3 dll幫助類 122 3.3.4 lambda鏈式調用 126 3.3.5 any類的實現 128 3.3.6 function_traits 131 3.3.7 variant的實現 134 3.3.8 ScopeGuard 140 3.3.9 tuple_helper 141 3.4 總結 153 第4章 使用C++11解決內存洩露的問題 155 4.1 shared_ptr共享的智能指針 155 4.1.1 shared_ptr的基本用法 156 4.1.2 使用shared_ptr需要注意的問題 157 4.2 unique_ptr獨占的智能指針 159 4.3 weak_ptr弱引用的智能指針 161 4.3.1 weak_ptr基本用法 161 4.3.2 weak_ptr返回this指針 162 4.3.3 weak_ptr解決循環引用問題 163 4.4 通過智能指針管理第三方庫分配的內存 164 4.5 總結 166 第5章 使用C++11讓多線程開發變得簡單 167 5.1 線程 167 5.1.1 線程的創建 167 5.1.2 線程的基本用法 170 5.2 互斥量 171 5.2.1 獨占互斥量std::mutex 171 5.2.2 遞歸互斥量std::recursive_mutex 172 5.2.3 帶超時的互斥量std::timed_mutex和std::recursive_timed_mutex 174 5.3 條件變量 175 5.4 原子變量 179 5.5 call_once/once_flag的使用 180 5.6 異步操作 181 5.6.1 獲取線程函數返回值的類std::future 181 5.6.2 協助線程賦值的類 std::promise 182 5.6.3 可調用對象的包裝類std::package_task 182 5.6.4 std::promise、std::packaged_task和std::future三者之間的關系 183 5.7 線程異步操作函數async 184 5.8 總結 185 第6章 使用C++11中便利的工具 186 6.1 處理日期和時間的chrono庫 186 6.1.1 記錄時長的duration 186 6.1.2 表示時間點的time point 188 6.1.3 獲取系統時鐘的clocks 190 6.1.4 計時器timer 191 6.2 數值類型和字符串的相互轉換 193 6.3 寬窄字符轉換 195 6.4 總結 196 第7章 C++11的其他特性 197 7.1 委托構造函數和繼承構造函數 197 7.1.1 委托構造函數 197 7.1.2 繼承構造函數 199 7.2 原始的字面量 201 7.3 final和override關鍵字 203 7.4 內存對齊 204 7.4.1 內存對齊介紹 204 7.4.2 堆內存的內存對齊 207 7.4.3 利用alignas指定內存對齊大小 207 7.4.4 利用alignof和std::alignment_of獲取內存對齊大小 208 7.4.5 內存對齊的類型std::aligned_storage 209 7.4.6 std::max_align_t和std::align操作符 211 7.5 C++11新增的便利算法 211 7.6 總結 216 第二篇 C++11工程級應用 第8章 使用C++11改進我們的模式 218 8.1 改進單例模式 218 8.2 改進觀察者模式 223 8.3 改進訪問者模式 227 8.4 改進命令模式 232 8.5 改進對象池模式 236 8.6 總結 240 第9章 使用C++11開發一個半同步半異步線程池 241 9.1 半同步半異步線程池介紹 241 9.2 線程池實現的關鍵技術分析 242 9.3 同步隊列 243 9.4 線程池 247 9.5 應用實例 250 9.6 總結 251 第10章 使用C++11開發一個輕量級的AOP庫 252 10.1 AOP介紹 252 10.2 AOP的簡單實現 253 10.3 輕量級的AOP框架的實現 255 10.4 總結 260 第11章 使用C++11開發一個輕量級的IoC容器 261 11.1 IoC容器是什麼 261 11.2 IoC創建對象 265 11.3 類型擦除的常用方法 267 11.4 通過Any和閉包來擦除類型 269 11.5 創建依賴的對象 273 11.6 完整的IoC容器 275 11.7 總結 283 第12章 使用C++11開發一個對象的消息總線庫 284 12.1 消息總線介紹 284 12.2 消息總線關鍵技術 284 12.2.1 通用的消息定義 285 12.2.2 消息的注冊 285 12.2.3 消息分發 289 12.2.4 消息總線的設計思想 289 12.3 完整的消息總線 292 12.4 應用實例 297 12.5 總結 301 第13章 使用C++11封裝sqlite庫 302 13.1 sqlite基本用法介紹 303 13.1.1 打開和關閉數據庫的函數 304 13.1.2 執行SQL語句的函數 305 13.2 rapidjson基本用法介紹 310 13.2.1 解析json字符串 310 13.2.2 創建json對象 311 13.2.3 對rapidjson的一點擴展 315 13.3 封裝sqlite的SmartDB 316 13.3.1 打開和關閉數據庫的接口 317 13.3.2 Excecute接口 319 13.3.3 ExecuteScalar接口 323 13.3.4 事務接口 325 13.3.5 ExcecuteTuple接口 325 13.3.6 json接口 327 13.3.7 查詢接口 329 13.4 應用實例 332 13.5 總結 335 第14章 使用C++11開發一個linq to objects庫 336 14.1 LINQ介紹 336 14.1.1 LINQ語義 336 14.1.2 Linq標准操作符(C#) 337 14.2 C++中的LINQ 339 14.3 LINQ實現的關鍵技術 340 14.3.1 容器和數組的泛化 341 14.3.2 支持所有的可調用對象 344 14.3.3 鏈式調用 345 14.4 linq to objects的具體實現 347 14.4.1 一些典型LINQ操作符的實現 347 14.4.2 完整的linq to objects的實現 349 14.5 linq to objects的應用實例 358 14.6 總結 360 第15章 使用C++11開發一個輕量級的並行task庫 361 15.1 TBB的基本用法 362 15.1.1 TBB概述 362 15.1.2 TBB並行算法 362 15.1.3 TBB的任務組 365 15.2 PPL的基本用法 365 15.2.1 PPL任務的鏈式連續執行 365 15.2.2 PPL的任務組 366 15.3 TBB和PPL的選擇 367 15.4 輕量級的並行庫TaskCpp的需求 367 15.5 TaskCpp的任務 368 15.5.1 task的實現 368 15.5.2 task的延續 369 15.6 TaskCpp任務的組合 372 15.6.1 TaskGroup 372 15.6.2 WhenAll 376 15.6.3 WhenAny 378 15.7 TaskCpp並行算法 381 15.7.1 ParallelForeach:並行對區間元素執行某種操作 381 15.7.2 ParallelInvoke:並行調用 382 15.7.3 ParallelReduce:並行匯聚 383 15.8 總結 386 第16章 使用C++11開發一個簡單的通信程序 387 16.1 反應器和主動器模式介紹 387 16.2 asio中的Proactor 391 16.3 asio的基本用法 394 16.3.1 異步接口 395 16.3.2 異步發送 397 16.4 C++11結合asio實現一個簡單的服務端程序 399 16.5 C++11結合asio實現一個簡單的客戶端程序 405 16.6 TCP粘包問題的解決 408 16.7 總結 413 參考文獻 414 View CodeC++11增加的新特性有一百多項,很多人質疑這會使本已復雜的C++語言變得更加復雜,從而產生一種抗拒心理,其實這是對C++11的誤解,C++11並沒有變得更復雜,恰恰相反,它在做簡化和改進!比如auto和decltype可以用來避免寫冗長的類型,bind綁定器讓我們不用關注到底是用bind1st還是bind2nd了,lambda表達式讓我們可以不必寫大量的不易維護的函數對象等。
語言都是在不斷進化之中的,只有跟上時代潮流的語言才是充滿活力與魅力的語言。C++正是這樣一門語言,雖然它已經有三十多年的歷史了,但是它還在發展之中。C++14標准已經制定完成,C++17也提上了日程,我相信C++的未來會更加美好,C++開發者的日子也會越來越美好!
本書現在在各大書店已經有售:
京東發售鏈接
china-pub發售鏈接
亞馬遜發售鏈接
天貓商城發售鏈接
為感謝大家支持,會送書給園友。
在回復的第4頁第4個留言的朋友將獲得簽名書一本。第6頁第6個留言的朋友將獲得簽名書一本。