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

高品質 C++/C 程式設計指南 第 5 章:常數定義——const 完勝 #define

     編輯:關於C++

5.1 為何需要常數?

  1. 可讀性:MAX 勝過 100。
  2. 防錯誤:多處硬編碼必改漏。
  3. 易維護:單點修改,全局生效。

規則 5-1-1:多次出現的字面值,**必提煉為有意義常數**。

5.2 const vs #define:完勝之戰

維度const 常數#define 巨集常數
型別✅ 有型別,編譯器型別檢查❌ 無型別,純文字替換
除錯✅ 整合除錯工具可監看❌ 預處理階段消失,不可除錯
作用域✅ 受作用域限制❌ 全域汙染
邊際效應✅ 無❌ 文字替換易產生邏輯錯誤

規則 5-2-1:C++ 專案**全面棄用 #define 定義常數,改用 const**。

5.3 常數定義管理規範

  • 規則 5-3-1:公開常數置於頭檔,私有常數置於實作檔頂部;跨模組常數集中管理於共用頭檔。
  • 規則 5-3-2:相關常數**定義時表達關係**,勿寫孤立值。
    
    const float RADIUS = 100;
    const float DIAMETER = RADIUS * 2; // 語義綁定,修改 RADIUS 自動同步
    

5.4 類別中的常數:static const / enum / constexpr

const 資料成員 ≠ 類別常數

const int SIZE = 100; 在類別宣告中**非法** (物件未建立時編譯器不知值)。
const 資料成員:**每個物件可有不同值**,初始化只能在建構函數初始化列表:


class A {
    A(int size) : SIZE(size) {}
    const int SIZE;
};
A a(100), b(200); // a.SIZE=100, b.SIZE=200

真正的類別級常數:enum / static const / constexpr


class A {
    enum { SIZE1 = 100, SIZE2 = 200 }; // 編譯期常數,不佔物件空間
    static const int SIZE3 = 300;      // C++11 起類內初始化合法
    constexpr int SIZE4 = 400;         // C++11 編譯期常數
    int arr1[SIZE1];
    int arr2[SIZE2];
};

enum 缺點:隱含 int,無法表達浮點數 (如 PI=3.14159)。

**現代 C++ 首選**:static constexpr (型別安全、編譯期求值、可取位址)。

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