高質量C++/C程式設計指南(第5章 常量) (轉)

worldblog發表於2007-12-12
高質量C++/C程式設計指南(第5章 常量) (轉)[@more@] 

章 常量

  常量是一種識別符號,它的值在執行期間恆定不變。C語言用 #define來定義常量(稱為宏常量)。C++ 語言除了 #define外還可以用const來定義常量(稱為const常量)。:namespace prefix = o ns = "urn:schemas--com::office" />

為什麼需要常量

如果不使用常量,直接在中填寫數字或字串,將會有什麼麻煩?

(1)  程式的可讀性(可理解性)變差。程式設計師自己會忘記那些數字或字串是什麼意思,則更加不知它們從何處來、表示什麼。

(2)  在程式的很多地方輸入同樣的數字或字串,難保不發生書寫錯誤。

(3)  如果要修改數字或字串,則會在很多地方改動,既麻煩又容易出錯。

 

【規則5-1-1儘量使用含義直觀的常量來表示那些將在程式中多次出現的數字或字串。

例如:

  #define    MAX  100  /*  C語言的宏常量  */

const int      MAX = 100;    //  C++ 語言的const常量

const float   PI = 3.14159;  //  C++ 語言的const常量

與 #define的比較

  C++ 語言可以用const來定義常量,也可以用 #define來定義常量。但是前者比後者有更多的優點:

(1)  const常量有資料型別,而宏常量沒有資料型別。可以對前者進行型別檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤(邊際效應)。

(2)  有些整合化的工具可以對const常量進行除錯,但是不能對宏常量進行除錯。

 

【規則5-2-1在C++ 程式中只使用const常量而不使用宏常量,即const常量完全取代宏常量。

常量定義規則

【規則5-3-1需要對外公開的常量放在頭中,不需要對外公開的常量放在定義檔案的頭部。為便於管理,可以把不同模組的常量集中存放在一個公共的標頭檔案中。

【規則5-3-2如果某一常量與其它常量密切相關,應在定義中包含這種關係,而不應給出一些孤立的值。

例如:

const  float  = 100;

const  float  DIAMETER = RADIUS * 2;

類中的常量

有時我們希望某些常量只在類中有效。由於#define定義的宏常量是全域性的,不能達到目的,於是想當然地覺得應該用const修飾資料成員來實現。const資料成員的確是存在的,但其含義卻不是我們所期望的。const資料成員只在某個生存期內是常量,而對於整個類而言卻是可變的,因為類可以建立多個物件,不同的物件其const資料成員的值可以不同。

  不能在類宣告中初始化const資料成員。以下用法是錯誤的,因為類的物件未被建立時,編譯器不知道SIZE的值是什麼。

  class A

  {…

  const int SIZE = 100;   // 錯誤,企圖在類宣告中初始化const資料成員

  int array[SIZE];  // 錯誤,未知的SIZE

  };

 

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

 

  怎樣才能建立在整個類中都恆定的常量呢?別指望const資料成員了,應該用類中的列舉常量來實現。例如

  class A

  {…

  enum { SIZE1 = 100, SIZE2 = 200}; // 列舉常量

  int array1[SIZE1]; 

  int array2[SIZE2];

  };

  列舉常量不會佔用物件的空間,它們在編譯時被全部求值。列舉常量的缺點是:它的隱含資料型別是整數,其最大值有限,且不能表示浮點數(如PI=3.14159)。

 

 

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-991837/,如需轉載,請註明出處,否則將追究法律責任。

相關文章