langShift

現代 C++ 特性

自 C++11 以來,C++ 經歷了顯著的演進,新的標準(C++14、C++17、C++20、C++23)引入了強大的特性,使語言更安全、更具表達力、更高效。這些現代特性通常提供了替代舊的、更容易出錯的慣用語的方法,並使 C++ 更接近 JavaScript 等語言提供的便利性,同時保留其性能優勢。

C++11/14/17/20 新特性概述

以下是近期 C++ 標準中引入的一些關鍵特性的簡要概述:

  • C++11: Lambda 表達式、auto 關鍵字、右值引用和移動語義、nullptrstd::threadstd::chronostd::unique_ptrstd::shared_ptr、基於範圍的 for 迴圈、初始化列表。
  • C++14: 泛型 Lambda、constexpr 改進、變數模板。
  • C++17: 結構化綁定、if constexprstd::optionalstd::variantstd::string_view、並行演算法。
  • C++20: 概念、範圍、協程、模組、std::spanstd::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/constauto 關鍵字
迭代for...offorEach基於範圍的 for 迴圈
資源管理垃圾回收、finally移動語義、智能指針 (RAII)
資料初始化陣列/物件字面量初始化列表

雖然 JavaScript 透過動態類型和運行時解釋實現了大部分靈活性,但現代 C++ 透過編譯時特性(模板、auto、Lambda)和明確的資源管理(移動語義、智能指針)實現了類似的表達力。這使得 C++ 能夠提供高階抽象和低階控制,通常具有卓越的性能。


練習題:

  1. C++ 中的 Lambda 表達式是什麼?提供一個範例,說明它們如何簡化程式碼,與傳統函式物件相比。
  2. 解釋移動語義和右值引用的概念。它們如何促進 C++ 中的性能優化?
  3. 描述在現代 C++ 程式碼中使用 auto 關鍵字和基於範圍的 for 迴圈的好處。它們如何提高可讀性和簡潔性?

專案構想:

  • 重構現有的 C++ 程式(或編寫一個新程式),該程式處理資料集合(例如,自訂物件的 std::vector)。利用現代 C++ 特性,例如用於自訂排序或過濾的 Lambda 表達式、用於類型推導的 auto,以及用於迭代的基於範圍的 for 迴圈。如果適用,演示在轉移大型物件所有權時使用移動語義。