現代 C++ 特性
自 C++11 以來,C++ 經歷了顯著的演進,新的標準(C++14、C++17、C++20、C++23)引入了強大的特性,使語言更安全、更具表達力、更高效。這些現代特性通常提供了替代舊的、更容易出錯的慣用語的方法,並使 C++ 更接近 JavaScript 等語言提供的便利性,同時保留其性能優勢。
C++11/14/17/20 新特性概述
以下是近期 C++ 標準中引入的一些關鍵特性的簡要概述:
- C++11: Lambda 表達式、
auto
關鍵字、右值引用和移動語義、nullptr
、std::thread
、std::chrono
、std::unique_ptr
、std::shared_ptr
、基於範圍的 for 迴圈、初始化列表。 - C++14: 泛型 Lambda、
constexpr
改進、變數模板。 - C++17: 結構化綁定、
if constexpr
、std::optional
、std::variant
、std::string_view
、並行演算法。 - C++20: 概念、範圍、協程、模組、
std::span
、std::jthread
。
Lambda 表達式
Lambda 表達式(或簡稱「Lambda」)是匿名函式,可以內聯定義並在需要函式物件的地方使用。它們對於簡短、局部化的操作非常有用,尤其是在演算法中。
- 語法:
[捕獲列表](參數) -> 返回類型 { 函式體 }
- 捕獲列表: 指定 Lambda 可以存取周圍作用域中的變數。
正在加载...
移動語義和右值引用
移動語義 (C++11) 允許高效地將資源(如動態分配的記憶體)從一個物件轉移到另一個物件,而無需昂貴的深層複製。這透過右值引用 (&&
) 實現。
- 左值: 指的是記憶體位置並具有身份的表達式(例如,變數)。
- 右值: 不指記憶體位置且沒有身份的表達式(例如,臨時物件、字面量)。
std::move
: 將左值轉換為右值引用,表示其資源可以被移動。
正在加载...
auto
關鍵字和類型推導
auto
關鍵字 (C++11) 允許編譯器從其初始化器推導變數的類型。這可以使程式碼更簡潔、更具可讀性,尤其是在處理複雜類型時。
正在加载...
基於範圍的 for 迴圈
基於範圍的 for 迴圈 (C++11) 提供了一種更簡單、更具可讀性的方式來迭代範圍內的元素(如容器、陣列或初始化列表),而無需明確使用迭代器。
正在加载...
初始化列表
初始化列表 (C++11) 提供了一種統一的方式來初始化物件,尤其是容器。它們使用大括號 {}
。
正在加载...
與 JavaScript 現代特性的比較
許多現代 C++ 特性旨在提供與 JavaScript 相似的表達力和便利性,同時保持 C++ 的核心優勢。
特性 | JavaScript 等效項 | C++ 現代特性 |
---|---|---|
匿名函式 | 箭頭函式、匿名函式 | Lambda 表達式 |
類型推導 | 動態類型、let /const | auto 關鍵字 |
迭代 | for...of 、forEach | 基於範圍的 for 迴圈 |
資源管理 | 垃圾回收、finally | 移動語義、智能指針 (RAII) |
資料初始化 | 陣列/物件字面量 | 初始化列表 |
雖然 JavaScript 透過動態類型和運行時解釋實現了大部分靈活性,但現代 C++ 透過編譯時特性(模板、auto
、Lambda)和明確的資源管理(移動語義、智能指針)實現了類似的表達力。這使得 C++ 能夠提供高階抽象和低階控制,通常具有卓越的性能。
練習題:
- C++ 中的 Lambda 表達式是什麼?提供一個範例,說明它們如何簡化程式碼,與傳統函式物件相比。
- 解釋移動語義和右值引用的概念。它們如何促進 C++ 中的性能優化?
- 描述在現代 C++ 程式碼中使用
auto
關鍵字和基於範圍的 for 迴圈的好處。它們如何提高可讀性和簡潔性?
專案構想:
- 重構現有的 C++ 程式(或編寫一個新程式),該程式處理資料集合(例如,自訂物件的
std::vector
)。利用現代 C++ 特性,例如用於自訂排序或過濾的 Lambda 表達式、用於類型推導的auto
,以及用於迭代的基於範圍的 for 迴圈。如果適用,演示在轉移大型物件所有權時使用移動語義。