Bjarne Stroustrup:the C++ Programming Language@2013 (第4版)

《C++ 程式語言 第四版》主要論點闡述

這本書,作為 Bjarne Stroustrup 關於 C++ 程式語言的第四版,其核心論點在於闡述 現代 C++ (C++11) 相較於其前身,是一個顯著改進的程式設計工具。作者強調,使用 C++11 可以更清晰、更簡單、更直接地表達程式設計思想,並且生成的程式具有更好的編譯時檢查和更高的執行效能。這本書旨在提供一個關於 C++ 程式語言及其標準函式庫的全面性介紹,特別是針對專業程式設計師的需求。

本書的結構組織旨在讓讀者可以根據自己的經驗水準進行閱讀。它融合了教學性質(從頭開始閱讀)和參考性質(隨時查閱特定主題)。全書分為四個主要部分:

  1. 引言 (Part I): 提供本書導覽、C++ 的背景資訊,並快速概述 C++ 語言和標準函式庫的基礎、抽象機制、容器與演算法,以及併發與公用程式等關鍵特性。旨在讓讀者初步了解現代 C++ 的能力。
  2. 基礎設施 (Part II): 深入探討 C++ 的內建型別、宣告、作用域、初始化、表達式、陳述句、函式等基本構件,以及異常處理、命名空間和原始檔案的組織方式。這部分內容是所有 C++ 程式設計風格的基礎。
  3. 抽象機制 (Part III): 這是本書的重點之一,詳細介紹了 C++ 支援各種抽象形式的機制,包括類別 (classes)、建構與解構、運算子多載、繼承與類別階層、執行時型別資訊 (RTTI),以及最為強大的範本 (templates) 機制,涵蓋泛型程式設計、特化、實例化、範本與階層的結合,乃至於後設程式設計 (metaprogramming)。這部分展示了如何使用 C++ 構建複雜且靈活的系統。
  4. 標準函式庫 (Part IV): 提供標準函式庫的詳盡概述和各組件的討論,包括容器 (containers)、演算法 (algorithms)、迭代器 (iterators)、記憶體與資源管理工具、字串、正規表達式、I/O 流、本地化、數學函式、以及對 C 標準函式庫的支援。標準函式庫被視為 C++ 高效程式設計的基石,並且其本身也是 C++ 語言特性和設計原則的實踐範例。

作者在書中闡述了 C++ 的核心設計理念:C++ 是一個通用程式語言,它提供了一個直接且高效的硬體模型,同時結合了定義輕量級抽象的強大設施。 換句話說,C++ 旨在成為一個用於 開發和使用精巧且高效抽象 的語言。兩個關鍵設計原則貫穿始終:

  1. 沒有比 C++ 更低層次的語言空間 (除非是組合語言): C++ 必須足夠高效,足以用於系統程式設計和資源受限的應用程式,以免程式設計師被迫退回到更低層次的語言以獲得所需的效能。
  2. 零額外開銷原則 (Zero-overhead Principle): 如果程式設計師可以手動編寫程式碼來模擬某個語言特性或基本抽象,並獲得哪怕一點點更好的效能,他們就會這麼做。因此,C++ 的語言特性和函式庫抽象被設計為不應比同等的手寫替代方案浪費任何位元組或處理器週期。

C++ 支援多種程式設計風格並強調其融合使用:程序式、資料抽象、物件導向程式設計、和泛型程式設計。作者認為,對於絕大多數非玩具範例的問題,最佳解決方案往往是結合這些風格的程式碼。過度專注於其中任一種風格都是一種錯誤,會導致開發效率低下和程式碼品質不佳。

靜態型別檢查 (Static Type Checking) 是 C++ 有效使用的核心。型別的存在對於表達力、可維護性和效能至關重要。C++ 的型別系統允許以非平凡的方式擴展,目標是讓使用者定義的型別獲得與內建型別相同的支援等級。雖然 C++ 為了與 C 相容性而允許在某些情況下繞過型別系統,但理想狀態始終是完全的型別安全。

標準函式庫 是 C++ 標準的很大一部分,並且是高效 C++ 程式設計的關鍵。函式庫組件(如容器和演算法)是由 C++ 本身實現的,證明了 C++ 作為系統程式設計語言的強大能力。標準函式庫提供了最常見的基本資料結構和演算法,應優先於自定義實現。

C 相容性 是 C++ 設計過程中的重要考量,這使得 C++ 能夠基於 C 已被證明的低層次設施並融入現有的技術社群。雖然存在一些不相容性,但 C++ 盡力保持與 C 的大多數約定一致,並且現代 C 也從 C++ 中借鑒了許多特性。然而,作者建議新手直接學習 C++,因為它更安全、表達力更強,並減少對低層次技巧的依賴。

C++11 引入了許多重要特性,這些特性使得 C++ 更適合於現代計算環境,尤其是在併發 (concurrency) 方面。移動語義 (move semantics) 大幅提高了處理資源的效率,初始化列表、Lambda 表達式、constexpr 函式、變長參數範本等特性提高了語言的表達力和使用便利性。這些新特性並非獨立存在,而是旨在共同使用,以支援更好的程式設計技術。

對於不同背景的讀者,本書提供了不同的學習建議:
* C++ 程式設計師: 利用 C++11 的新特性來更新設計和程式設計技術,例如使用 {} 初始化、智能指標、移動語義、lambda 等。
* C 程式設計師: 避免以 C 風格編寫 C++ 程式碼,擁抱 C++ 的高層次抽象機制和標準函式庫。
* Java 程式設計師: 認識 C++ 與 Java 的根本差異,學習 C++ 的資源管理 (RAII)、型別系統和抽象機制,避免直接套用 Java 程式設計風格。

總結來說,本書的核心論點是 現代 C++ (C++11) 是一個強大、靈活、高效且表達力極強的程式語言,特別適用於需要兼顧效能與抽象的系統和應用程式,而其標準函式庫是實現這一目標不可或缺的工具。本書旨在引導讀者掌握現代 C++ 的關鍵特性、設計原則和程式設計技術,成為更優秀的程式設計師和設計師。