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

C++11 新特性:Static Assertions 與 Constructor Delegation

     編輯:關於C++

Static Assertions (靜態斷言)

在編譯期進行條件檢查,失敗則報錯並停止編譯。語法:

static_assert(bool_constexpr, "錯誤訊息字符串");
  • bool_constexpr:編譯期常量表達式(如 sizeof(void*) == 8)。
  • 第二參數為編譯錯誤訊息(C++11 必須提供,C++17 可選)。

示例

// 檢查指針大小
static_assert(sizeof(void*) == 8, "僅支援 64 位平台");

// 檢查類型特性
static_assert(std::is_pod::value, "T 必須是 POD 類型");

// 模板中約束參數
template
struct Buffer {
    static_assert(N > 0, "緩衝區大小必須為正");
    char data[N];
};

Constructor Delegation (構造函數委託)

C++11 允許一個構造函數在初始化列表中調用同類的另一個構造函數,避免代碼重複。被委託的構造函數先執行,再執行當前構造函數體。

C++03 模式:私有 init() 方法

class A {
    void init() { /* 共同初始化 */ }
public:
    A() { init(); }
    A(int x) { init(); doExtra(x); }
};

C++11 委託寫法

class A {
    void doExtra(int x) { /* ... */ }
public:
    A() { /* 共同初始化 */ }
    A(int x) : A() { doExtra(x); } // 委託給無參構造
};

結合成員初始化 (C++11 Non-static Data Member Initializers)

class A {
    int a = 99;          // 直接在聲明處初始化
    std::string s = "hi";
public:
    A() = default;       // 使用默認構造
    A(int x) : A() { a = x; } // 委託後修改
};

拷貝構造函數委託

A(const A& other) : A() { // 先委託默認構造
    a = other.a;           // 再複製數據
}

標準引述說明

C++03 認為對象在構造函數結束時構造完成;C++11 認為任一構造函數結束時對象即構造完成。因為委託鏈中每個構造函數都在完全構造的對象上執行,派生類構造函數在基類所有委託完成後才執行。

總結

  • static_assert:將運行期錯誤前移至編譯期,提升庫代碼健壯性。
  • 構造函數委託:消除初始化代碼重複,配合成員初始化器語法更簡潔。
  • 兩者均為 C++11 核心語言特性,無運行期開銷,現代 C++ 開發必備。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved