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

C++ 常數完全指南:const vs #define、類別常數與列舉常數

     編輯:VC 教學

第 5 章 常數

常數是執行期恆定不變的識別符。C 用 #define(巨集常數),C++ 除 #define 外還有 const(const 常數)。

5.1 為何需要常數?

直接在程式碼寫死數字/字串(Magic Number)的弊端:

  1. 可讀性差,自己與使用者都不知含義。
  2. 多處重複輸入易出錯。
  3. 修改時須多處同步,麻煩且易漏改。

規則 5-1-1:多次出現的數字/字串,盡量用語意直觀的常數表示。

#define MAX 100              // C 巨集常數
const int MAX = 100;         // C++ const 常數
const float PI = 3.14159;

5.2 const vs #define:const 完勝

  1. 型別安全:const 常數有資料型別,編譯器可型別檢查;巨集常數無型別,僅文字替換,無型別檢查,且替換過程可能產生邊際效應錯誤。
  2. 除錯支援:整合除錯工具可檢視 const 常數,無法檢視巨集常數。

規則 5-2-1:C++ 程式僅使用 const 常數,完全取代巨集常數。

5.3 常數定義規則

  • 規則 5-3-1:需對外公開的常數放標頭檔,私有常數放實作檔開頭。便於管理可集中存放於共用標頭檔。
  • 規則 5-3-2:相關常數間的關係應在定義中體現,勿給孤立值。
    const float RADIUS = 100;
    const float DIAMETER = RADIUS * 2;  // 體現關係
    

5.4 類別中的常數

欲讓常數僅在類別內有效,#define 因全域可見無法滿足。直覺用 const 修飾資料成員,但 const 資料成員僅在單一物件生命週期內為常數,對整個類別而言是可變的(不同物件可有不同值)。

const 資料成員限制

  • 不可在類別宣告中初始化(編譯期物件未建立,不知值)。
  • 只能在建構函式初始化列表中初始化:
class A {
    A(int size);
    const int SIZE;
};
A::A(int size) : SIZE(size) { ... }
A a(100); // a.SIZE = 100
A b(200); // b.SIZE = 200

真正的類別級常數:列舉常數

用 enum 實現整個類別恆定的常數:

class A {
    enum { SIZE1 = 100, SIZE2 = 200 }; // 列舉常數
    int array1[SIZE1];
    int array2[SIZE2];
};
  • 優點:不佔物件儲存空間、編譯期求值、可作陣列大小。
  • 缺點:隱含型別為整數、最大值有限、無法表示浮點數(如 PI=3.14159)。

浮點數類別常數無完美方案,常見做法:static const float PI = 3.14159f;(需在 .cpp 定義)或命名空間層級 const float PI = ...。

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