前言
PREFACE
C++語言至今擁有40多年的歷史,目前最新的C++標準已經發展到了C++20,它給我們帶來了相當重要的四大特性:概念約束、ranges(范圍)標準庫、協程以及模塊。
? 概念約束是一個編譯期謂詞,它根據程序員定義的接口規范對類型、常量等進行編譯時檢查,以便在泛型編程中為使用者提供更好的可讀性與錯誤信息。
? ranges標準庫對現有的標準庫進行了補充,它以函數式編程范式進行編程,將計算任務分解為一系列靈活的原子操作,使得代碼的正確性更容易推理。
? 協程是一種可掛起、可恢復的通用函數,它的切換開銷是納秒級的,相對其他方案而言占用的資源極低,并且可以非侵入式地為已有庫擴展協程接口,它常常用于并發編程、生成器、流處理、異常處理等。
? 模塊特性解決了傳統的頭文件編譯模型的痛點:依賴順序導致頭文件難以組合、重復解析、符號覆蓋等問題,從語言層面為程序員提供了模塊化的手段。
本書針對以上新特性準備了豐富的代碼樣例,相信讀者通過這些代碼很容易掌握這些特性。作為一本講解C++高級編程的書,本書還探討了很多元編程話題,這是作為庫開發必不可少的技能,它們也將隨著C++的演進而不斷演進,大大提升了庫開發者的編程體驗,尤其是近年來C++的標準提案經歷了從模板元編程向constexpr元編程的轉換過程。
縱觀C++的演進歷程可以發現,每一次演進提供的特性大多數和編譯時相關,因為它的特點是零成本抽象,允許程序員表達抽象的概念而無須忍受不必要的運行時開銷。而一些運行時特性相當少,在面向對象的虛函數特性之后再無運行時特性,或者它們通常以庫的形式提供,例如從C++17起標準庫引入的variant類型,它通過元編程技術生成虛函數表。
C++對語言特性與庫特性區分得非常清楚,它希望程序員能夠在不引入語言機制的情況下實現一些功能,例如其他編程語言常常將元組tuple作為內建類型,而在C++中它們以庫的方式提供,程序員能夠利用現有的語言特性實現這些組件。
如何合理、高效地運用這些知識,它們背后通常蘊含著什么指導思想?那就是組合式思想,將問題分而治之,從而能夠應對許多難題。C++語言提供了足夠多的抽象機制,允許程序員提出各種假設,并基于這些假設進行靈活組合。
本書話題不局限于C++20,對現代C++中很多重要的特性也會深入探討,例如右值引用。一些編程原則,面向對象設計模式也會探討。最后一章將帶領讀者實現兩個庫:配置文件反序列庫與協程庫。它們大量使用C++20提供的特性,并使用元編程的方式構建,以對全書知識進行一個總結。
本書要求讀者需要有C++的基礎知識,最好能夠掌握一些現代C++的知識,考慮到市面上的書籍以及網絡上這方面的資料比較豐富,筆者在提及這些知識時會引用相關鏈接供讀者查閱。對于想要系統性學習C++20并進階C++技能的讀者,一定不要錯過本書。
本書創作歷時一年多,筆者在工作與業余時間不斷磨煉C++技能,這期間很多人為我提供了幫助與支持,沒有你們本書就不可能問世。
感謝我所在的工作團隊為我提供了良好的工作環境,讓我能夠隨心所欲地探索軟件上的新技術。其間,袁英杰大師加入了我們團隊參與開發,給我帶來了很大的啟發。
我從他身上學到了很多編程思想,這些思想并不是空談,而是真真切切能夠影響到整個編碼過程,并且指導了我的軟件開發工作。在與袁英杰大師共事的幾個月里,我感受到了大師代碼里處處充滿組合式思想,泛型、抽象運用得非常優雅,能夠充分應對軟件開發中的各種變化。
偶然在公司的一次關于軟件重構的演講中,我認識了吳詠煒老師,從那時起,我們便時常交流C++相關話題,在交流過程中我也學習到了很多。吳詠煒老師犧牲個人時間為本書做技術校對,他非常細心,幫我避免了很多技術上以及排版上的錯誤,并且對一些章節提出了調整建議。
由于C++20剛標準化不久,業界的很多優秀資料都是英文的。在我創作過程中閱讀這些資料難免會遇到困難,職愈博(Norman Zhi)給我在一些語法上的理解提供了幫助。他是一位優秀的硬件工程師,有時候我們會討論很多與Linux、性能、C語言相關的話題,這也為本書提供了一些靈感。
機械工業出版社的李曉波編輯也為本書能夠順利出版提供了幫助。還要感謝讀者選擇了這本書,期待你能夠從中獲得啟發。最后,感謝我的妻子,正是你的鼓勵、付出與陪伴,才讓我能夠專心完成本書的創作。
羅能
- HornetQ Messaging Developer’s Guide
- C語言程序設計案例教程(第2版)
- 軟件項目管理(第2版)
- Mastering Scientific Computing with R
- 嚴密系統設計:方法、趨勢與挑戰
- C/C++程序員面試指南
- Mastering Linux Security and Hardening
- Frank Kane's Taming Big Data with Apache Spark and Python
- Learning Material Design
- Zabbix Performance Tuning
- Java Web應用開發給力起飛
- JSP程序設計與案例實戰(慕課版)
- Hands-On Robotics Programming with C++
- Raspberry Pi Blueprints
- 高性能PHP 7