C++ Primer, Fifth Edition
一本全面且權威的 C++ 指南,完全為 C++11 標準重寫。本課程涵蓋從基本語言元素到複雜的函式庫功能以及進階類別設計工具的所有內容。
課程總覽
📚 內容概要
一本全面且權威的 C++ 指南,完全根據 C++11 標準重寫。本課程涵蓋從基本語言元素到複雜的庫功能以及高級類設計工具的全部內容。
現代 C++11 程式設計的業界標準典範指南。
作者: Stanley B. Lippman、Josée Lajoie、Barbara E. Moo
致謝: Dave Abrahams、Andy Koenig、Stephan T. Lavavej、Jason Merrill、John Spicer、Herb Sutter、Bjarne Stroustrup、Alex Stepanov,以及標準化委員會的成員們。
🎯 學習目標
- 定義並實作
main函數,並理解其與操作系統的互動。 - 執行命令列編譯,並管理基本的 I/O 流(
cin、cout)。 - 運用流程控制語句解決迭代邏輯問題,例如統計出現次數。
- 實作邏輯結構以統計和處理連續輸入資料的出現次數。
- 在控制語句中區分賦值運算子(
=)與相等運算子(==)。 - 使用類物件(
Sales_item),透過點運算子存取成員函數,並包含自訂標頭檔案。 - 辨別不同基本型態,並預測類型轉換與無符號算術溢位的結果。
- 實作 C++11 特性,包括列表初始化、
nullptr、constexpr及型別推導修飾詞。 - 區分變數宣告與定義,並應用作用域規則來管理識別符可見性。
- 辨別參考與指標之間的差異,並使用
void*進行通用記憶體處理。
🔹 第一課:C++ 入門與基本輸入/輸出
概述: 本課介紹 C++ 程式的基礎架構,重點在 main 函數、基本資料型態與編譯過程。內容涵蓋使用 iostream 庫進行基本的輸入/輸出(I/O)操作,透過 while 與 for 迴圈實現邏輯,並以 Sales_item 類別為例介紹物件導向概念。
學習成果:
- 定義並實作
main函數,並理解其與操作系統的互動。 - 執行命令列編譯,並管理基本的 I/O 流(
cin、cout)。 - 運用流程控制語句解決迭代邏輯問題,例如統計出現次數。
🔹 第二課:控制流程與基本類別概念
概述: 本課由基本控制流程過渡至 C++ 的核心力量——類別。學習者將掌握處理資料流(統計連續出現次數)所需的邏輯,並學習如何使用 Sales_item 類別,如同使用內建型別般輕鬆處理複雜資料結構。課程最後將實現一個功能完整的書店程式,整合檔案重新導向與錯誤報告。
學習成果:
- 實作邏輯結構以統計和處理連續輸入資料的出現次數。
- 在控制語句中區分賦值(
=)與相等(==)運算子。 - 使用類別物件(
Sales_item),透過點運算子存取成員函數,並包含自訂標頭檔案。
🔹 第三課:基本型態與變數
概述: 本課建立 C++ 程式設計的基礎構塊,探討算術型態、變數生命週期與記憶體模型。學生將掌握類型轉換(特別是無符號型態)的細節、C++11 的列表初始化語法,以及指標與參考之間的重要差異。課程最後探討進階型態系統,包括 const 修飾詞、型別推導(auto、decltype),並使用前置處理器守衛實作強健的自訂資料結構。
學習成果:
- 辨別不同基本型態,並預測類型轉換與無符號算術溢位的結果。
- 實作 C++11 特性,包括列表初始化、
nullptr、constexpr及型別推導修飾詞。 - 區分變數宣告與定義,並應用作用域規則管理識別符可見性。
🔹 第四課:複合型態與現代型態修飾詞
概述: 本課探討 C++11 的複雜型態系統,聚焦於複合型態(指標與參考)如何與 const 及 constexpr 等型態修飾詞互動。學生將掌握使用 auto 與 decltype 進行型別推導的細節,並學習如何利用前置處理器標頭守衛將資料封裝於自訂結構中。
學習成果:
- 辨別參考與指標之間的差異,並使用
void*進行通用記憶體處理。 - 分類並應用頂層與底層的
const修飾詞及constexpr以建立編譯時期常數。 - 實作 C++11 型別推導(
auto與decltype),撰寫靈活且易維護的程式碼。
🔹 第五課:標準程式庫字串與向量
概述: 本課介紹 C++ 標準程式庫的基本型態 string 與 vector,提供比內建型態更彈性且安全的替代方案。學生將學習如何透過 using 宣告管理命名空間存取,初始化與操作可變長度字串與容器,並使用範圍迴圈與迭代器高效處理資料集合。
學習成果:
- 使用
namespace using宣告簡化程式碼,同時避免標頭檔案中的常見陷阱。 - 進行穩健的字串與向量初始化,包括 C++11 列表初始化。
- 使用
push_back、範圍迴圈與基本迭代器操作,實作字元級處理與動態容器擴展。
🔹 第六課:迭代器與內建陣列
概述: 本課探討 C++11 中導航與管理序列的基本機制。從現代高階工具如 string 與 vector 的迭代器,過渡到低階的內建陣列、指標運算與 C 風格字串。學生將學習如何與傳統陣列式程式碼介接現代標準程式庫容器,並管理複雜的多維結構。
學習成果:
- 使用迭代器與迭代器運算來導航與操作
string與vector容器。 - 使用指標運算與
begin/end庫函數定義、初始化與導航內建陣列。 - 實作 C 風格字串操作,並安全地將內建陣列與現代庫型別介接。
🔹 第七課:表示式、運算子與轉換
概述: 本課探討 C++ 表示式的基礎構塊,專注於語言如何評估運算與管理資料型態。學生將掌握左值(lvalue)與右值(rvalue)的區別、運算子優先順序與結合性的規則,以及算術、邏輯與位運算的操作機制。此外,課程深入探討 C++ 型態管理,包括隱含算術轉換與明確命名轉換的安全應用。
學習成果:
- 区分左值(物件身分)與右值(物件值),並理解其在表示式中的角色。
- 依憑優先順序、結合性與短路邏輯預測複雜表示式的評估順序。
- 使用位運算子進行底層資料操作,並透過隱含轉換與明確命名轉換管理型態安全性。
🔹 第八課:進階語句與例外處理
概述: 本課涵蓋重要的 C++ 流程控制結構,從基本語句類型與作用域規則,到進階的條件與迭代邏輯。同時介紹使用 C++ 例外處理機制與標準程式庫例外階層的穩健錯誤處理技術。
學習成果:
- 區分空值、簡單與複合語句,並在這些結構中管理變數作用域。
- 使用
if與switch語句實作複雜決策邏輯,並解決「懸掛 else」等邏輯錯誤。 - 根據特定程式任務選擇並應用適當的迭代結構(
while、for、範圍for、do while)。
🔹 第九課:函數設計與參數傳遞
概述: 本課探討 C++ 函數的架構,專注於資料如何傳入與從模組化程式碼區塊傳回。內容涵蓋本地物件的生命週期、參數傳遞機制(值傳遞與參考傳遞),以及處理變數參數的 C++11 標準。掌握這些概念可讓程式設計師撰寫高效、可重用且記憶體安全的程式碼。
學習成果:
- 區分參數初始化方法及其對效能與資料完整性的影響。
- 使用
const修飾詞、initializer_list與陣列傳遞技巧,實作穩健的函數介面。 - 有效管理物件生命週期,使用自動與靜態儲存期間。
🔹 第十課:進階功能與函數重載
概述: 本課探討 C++ 函數的複雜機制,專注於參數傳遞、物件生命週期與函數重載的複雜性。學生將掌握 C++11 特性,如 initializer_list 用於變數參數、constexpr 函數,以及函數指標的宣告與使用,以創造靈活、模組化的程式碼。
學習成果:
- 區分值傳遞與參考傳遞,並判斷何時應使用
const參數。 - 應用重載解析規則,從候選與可行函數中決定「最佳匹配」。
- 實作與管理函數指標,包括在向量等容器中使用及作為回傳類型。
🔹 第十一課:類別封裝與建構函數
概述: 本課探討從簡單資料結構過渡至抽象資料型態(ADT)的過程。重點在類別設計的機制,包括成員函數、隱含的 this 指標,以及建構函數在物件初始化中的關鍵角色。此外,還探討透過存取控制(public/private)與「朋友」機制,以維持乾淨介面並隱藏實作細節。
學習成果:
- 設計並實作一個 C++ 類別(如
Sales_data),將其介面與實作分離。 - 掌握使用預設、重載與顯式建構函數的物件初始化規則。
- 透過存取修飾詞與朋友宣告,強化封裝並管理類別作用域。
🔹 第十二課:類別作用域與轉換管理
概述: 本課探討 C++ 類別設計的進階機制,聚焦於從簡單資料結構過渡至穩健的抽象資料型態(ADT)。主要議題包括透過不同類型的建構函數管理物件初始化、使用 explicit 關鍵字控制隱含型別轉換,以及了解類別層級的實體,如 static 成員與字面量類別。
學習成果:
- 使用存取修飾詞與朋友宣告設計並實作封裝的類別(ADT)。
- 管理隱含類別型別轉換,並使用
explicit關鍵字加以抑制。 - 實作並初始化
static類別成員,以進行類別層級的資料管理。
🔹 第十三課:串列輸入/輸出與序列容器基礎
概述: 本課探討 C++ 標準程式庫的 I/O 系統與序列容器的基本機制。學生將學習管理串流狀態與輸出緩衝區,執行檔案與字串基於的 I/O,並導航程式庫的序列容器。課程強調迭代器範圍、容器初始化,以及容器記憶體管理的效能影響等關鍵概念。
學習成果:
- 探查與重置串流狀態,並控制輸出緩衝區刷新以維持串流完整性。
- 使用
fstream與sstream以各種檔案模式進行持久化與記憶體中資料處理。 - 根據存取模式與記憶體開銷選擇合適的序列容器,以優化選擇。
🔹 第十四課:容器操作與通用演算法
概述: 本課探討 C++ 序列容器的管理,以及應用通用演算法處理資料,獨立於容器型態。探討容器如何處理記憶體增長與元素生命週期,並利用 lambda 表達式與函數繫結器客製化程式庫演算法。學生將掌握程式庫架構,包括迭代器類別與專用演算法。
學習成果:
- 使用專用操作管理容器生命週期,包括
forward_list的特殊操作、調整大小技術與vector容量管理。 - 使用擴充的
string庫與容器適配器執行複雜的字串操作與數值轉換。 - 實作通用演算法以讀取、寫入與重新排序資料,並透過謂詞、lambda 表達式與
std::bind客製化行為。
🔹 第十五課:關聯容器與智慧指標
概述: 本課探討 C++11 的關聯容器標準與動態記憶體管理。詳述有序與無序容器的高效鍵值檢索使用方式,以及使用智慧指標實作穩健、例外安全的程式碼。課程最後設計一個真實世界的文字查詢應用程式,整合這些複雜資料結構。
學習成果:
- 使用高效搜尋、插入與下標技術實作與操作關聯容器。
- 透過從手動
new/delete轉向基於 RAII 的智慧指標與allocator類別,掌握動態記憶體管理。 - 使用參考計數與智慧指標擁有權設計複雜系統,以安全地跨類別共享資料。
🔹 第十六課:資源管理與移動語意
概述: 本課探討 C++ 類別如何透過「五大特殊成員函數」控制其資源的生命週期。學生將學習使用值類型與指標類型策略管理動態記憶體,實作例外安全的「複製與交換」慣例,並運用 C++11 移動語意與右值引用優化效能。
學習成果:
- 實作並解釋「三條法則/五條法則」,確保正確的資源管理,防止記憶體洩漏。
- 區分值類型與指標類型的類別行為,並實作參考計數。
- 使用右值引用與
std::move應用移動語意,消除大型物件不必要的深層複製。
🔹 第十七課:運算子重載與繼承(OOP)
概述: 本課探討透過運算子重載延伸語言語法,以及透過物件導向程式設計(OOP)建立可擴展系統。學生將學習設計能與內建運算整合的類別,並掌握繼承、動態繫結與多型類別階層的機制。
學習成果:
- 設計並實作符合 C++ 標準程式庫慣例的重載運算子。
- 建立並使用函數物件與
function類型包裝器,統一可呼叫實體。 - 使用虛擬函數、抽象基底類別與 C++11 存取修飾詞建構穩健的繼承階層。
🔹 第十八課:模板與泛型程式設計
概述: 本課探討 C++ 模板的基本與進階機制,奠定泛型程式設計的基礎。學生將從定義基本函數與類別模板,過渡至掌握 C++11 特有的功能,如可變參數模板、完美轉送與模板專化。
學習成果:
- 使用類型與非類型參數定義並實例化函數與類別模板。
- 管理模板編譯模型,並使用
extern template控制跨檔案的實例化。 - 實作進階推導技術,包括尾隨回傳型態與使用
std::forward的完美轉送。
🔹 第十九課:專用程式庫工具與大型系統
概述: 本課探討進階的 C++11 標準程式庫元件與語言特性,專為複雜系統開發設計。涵蓋專用資料結構、透過 regex 庫進行穩健的模式匹配,以及大型程式設計的架構工具。此外,還探討進階例外處理、命名空間管理,以及多重繼承的複雜性。
學習成果:
- 使用
tuple回傳多個值,並使用bitset進行高效的位級旗標管理。 - 透過
regex庫實作複雜的字串模式匹配、驗證與轉換。 - 使用引擎與分布產生高品質的隨機數,同時維持正確的狀態與種子。