兩種初始化形式
- **複製初始化**:`Type obj = value;` 可能產生臨時對象再拷貝(C++17 強制消除)。
- **直接初始化**:`Type obj(value);` 或 `Type obj{value};` 直接調用匹配構造函數,效率更高。
變量初始化規則
| 類型 | 全局/靜態 | 局部(非靜態) |
| 內置類型 | 0 初始化 | 不初始化(不定值) |
| 類類型 | 默認構造 | 默認構造 |
構造函數初始化列表
**必須**用於:
- `const` 成員
- 引用成員
- 無默認構造函數的類類型成員
- 基類構造函數需要參數時
class Base { public: Base(int x) : val(x) {} int val; };
class Derived : public Base {
const int c;
int &ref;
public:
Derived(int x, int y, int z) : Base(x), c(y), ref(z) {} // 必須列表初始化
};
成員初始化順序
**聲明順序**,與初始化列表書寫順序無關。
銷毀順序與初始化順序**相反**。
派生類構造流程
- 基類構造(按繼承聲明順序)
- 成員變量構造(按聲明順序)
- 派生類構造函數體執行
定義 vs 聲明
- **定義**:分配存儲、可初始化。一個程序中實體僅能定義一次。
- **聲明**:引入名字,不分配存儲。可多次聲明。
- `extern` 聲明不定義;帶初始化器的聲明視為定義。
最佳實踐
- 優先使用直接初始化(`{}` 或 `()`)。
- 構造函數**總是**使用初始化列表初始化所有成員。
- 成員聲明順序按「基類 → 數據成員 → 引用/const」排列,避免未初始化使用。
- 上一篇文章: POJ 1845 Sumdiv:A^B 約數和模 9901(遞歸等比數列求和 + 逆元避坑)
- 下一篇文章: HDU 4035 Maze:樹上概率 DP 求期望通過隧道數(高斯消元 / 遞推)
Copyright ©
程式碼之家 All Rights Reserved