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

C++ 標準庫現代特性讀書筆記 - 模板空格、nullptr、auto、統一初始化、移動語義

     編輯:關於C++

C++11/14/17 核心語法提升

1. 模板嵌套空格(C++11)

vector> v1;      // OK C++11 起
vector > v2;     // C++98 風格(需空格避免 >> 被解析為移位)

2. nullptr 與 nullptr_t

nullptr 類型為 std::nullptr_t,可隱式轉換為任意指針類型,不會 轉換為整數,解決 NULL/0 重載歧義。

void f(int); void f(void*); void f(nullptr_t);
f(0);       // 調用 f(int) ❌
f(NULL);    // 調用 f(int) ❌
f(nullptr); // 調用 f(void*) ✅
f((void*)0); // 調用 f(void*) ✅

3. auto 類型推導

auto x = 10;        // int
auto y = 3.14;      // double
auto z = f();       // 推導 f() 返回類型
// auto a; // 錯誤:必須初始化

4. 統一初始化(大括號初始化)

  • 適用於所有類型:int i{42}; vector v{1,2,3};
  • 禁止窄化轉換:int i{3.14}; 編譯錯誤
  • initializer_list 構造函數優先級最高
class P {
    P(int, int) { cout << "1"; }
    P(initializer_list) { cout << "2"; }
};
P p1(1,2);  // 輸出 1
P p2{1,2};  // 輸出 2(initializer_list 優先)
P p3{1,2,3};// 輸出 2

5. 範圍 for 循環

for (auto& x : {1, 2, 3}) cout << x << ' ';  // 1 2 3
for (auto& [k, v] : map) { ... }  // C++17 結構化綁定

6. 移動語義與右值引用

class People {
    People() { cout << "默認構造"; }
    People(int) { cout << "參數構造"; }
    People(const People&) { cout << "拷貝構造"; }
    People(People&&) { cout << "移動構造"; }  // 右值引用
    People& operator=(const People&) { cout << "拷貝賦值"; return *this; }
};

vector v;
People p(100);
v.push_back(move(p));  // 輸出:移動構造
// move 將 lvalue 轉為 xvalue(將亡值),觸發移動構造

關鍵概念對比表

特性C++98C++11/14/17
空指針NULL / 0nullptr
類型推導無auto / decltype
初始化(), ={} 統一初始化
循環迭代器手寫範圍 for
資源轉移拷貝/交換移動語義 (move)
智能指針auto_ptrunique_ptr/shared_ptr

工程實踐建議

  1. 優先用 {} 初始化:防止窄化、最令人困惑的解析
  2. 用 nullptr 替代 NULL:類型安全,避免重載陷阱
  3. 善用 auto:簡化複雜類型聲明,配合範圍 for
  4. 移動而非拷貝:std::move、返回值優化 (RVO/NRVO)
  5. 避免裸 new/delete:make_unique, make_shared, 容器
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved