首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 現代特性學習筆記(一):從二進制字面量到 Lambda 泛型

     編輯:關於C++

C++ 現代特性學習筆記(一):從二進制字面量到 Lambda 泛型

基於《C++14 Quick Syntax Reference》整理,記錄 C++11/14 引入的實用新特性。測試環境:GCC 5.3.0。


1. 數字字面量增強


int oct = 062;        // 八進制(舊)
int hex = 0x32;       // 十六進制(舊)
int bin = 0b00110010; // 二進制(C++14 新增)
int longBin = 0b1010'0101'1010'0101; // 單引號分隔符(C++14)

2. 空指針 nullptr(C++11)


int* p = nullptr;           // 類型安全,非整數 0
nullptr_t mynull = nullptr; // 具體類型 nullptr_t

3. 右值引用與移動語義(C++11)


int&& ref = 1 + 2;  // 綁定臨時對象
ref += 3;           // 可修改
std::cout << ref;   // 6

核心:避免不必要的拷貝,實現資源轉移。


4. 原生字符串字面量(C++11)


// 傳統轉義
std::string escaped = "c:\\Windows\\System32\\cmd.exe";
// 原生字符串
std::string raw = R"(c:\Windows\System32\cmd.exe)";
// 正則表達式極大簡化
char regex[] = R"((?:'(?:[^\\']|\\.)*'|"(?:[^\\"]|\\.)*"))";

5. 新字符類型與 UTF 字面量(C++11)


char16_t c16 = u'中';   // UTF-16
char32_t c32 = U'中';   // UTF-32
std::string s8 = u8"UTF-8";
std::u16string s16 = u"UTF-16";
std::u32string s32 = U"UTF-32";

6. 範圍 for 循環(C++11)


int a[3] = {1,2,3};
for (int& x : a) std::cout << x;  // 引用可修改
for (auto& x : vec) std::cout << x; // 推薦 auto&

7. auto 與 decltype(C++11/14)


auto i = 5;        // int
auto d = 3.14;     // double
auto b = false;    // bool

int& ref = i;
auto copy = ref;   // int (值拷貝)
auto& ref2 = ref;  // int& (保留引用)

decltype(3) x = 3;      // int&& (字面量是右值)
decltype((3)) y = 3;    // int& (括號表達式是左值)

// C++14 返回類型推導
auto getValue(int x) { return x; }  // 自動推導返回 int
decltype(auto) getRef(int& x) { return x; } // 保留引用類型

8. Lambda 表達式(C++11/14)


// 基本語法
auto sum = [](int x, int y) { return x + y; }; // 返回類型自動推導
std::cout << sum(2, 3); // 5

// 作為參數傳遞
void call(int arg, std::function func) { func(arg); }
call(2, [](int x) { std::cout << x*x; }); // 4

// 捕獲列表 []
int i = 2;
auto printSquare = [i]() { std::cout << i*i; }; // 值捕獲,只讀
// [i]() mutable { i++; ... } // mutable 允許修改副本

// 引用捕獲
int a = 1;
[&a](int x) { a = x*x; }(12); // a 變為 144

// C++14 泛型 Lambda
auto add = [](auto x, auto y) { return x + y; };
add(2, 3); add(2.2, 3.0); add(2.2, 3);

// C++14 初始化捕獲
int x = 1;
[&, y = 2]() { x += y; }(); // x 變為 3

核心收穫

  • 類型推導:auto/decltype 減少冗長類型聲明,配合範圍 for 極大提升可讀性
  • Lambda:從函數對象到即時函數定義,捕獲機制靈活替代 std::bind
  • 移動語義:右值引用是現代 C++ 性能基石,理解「值類別」至關重要
  • 字面量:二進制、原生字符串、UTF 字面量解決實際編碼痛點

下篇將介紹類與對象的新特性:委託構造、繼承構造、刪除函數、final/override 等。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved