程式的可讀性(可理解性)變差。程式設計師自己會忘記那些數字或字串是什麼意思,使用者則更加不知它們從何處來、表示什麼。
在程式的很多地方輸入同樣的數字或字串,難保不發生書寫錯誤。
如果要修改數字或字串,則會在很多地方改動,既麻煩又容易出錯。
常量,就是我們希望在整個**中,這個量不能改變,所以用 const 修飾會更好
對於 c 中,一般用 #define 來定義常量,而到了 c++ 中,都是用 const 來定義常量
#define max 100
/* c 語言的巨集常量 */
const
int max =
100;
// c++ 語言的 const 常量
const
float pi =
3.14159
;// c++ 語言的 const 常量
雖然 c++ 中,也是可以用 #define 定義常量,但是,在 c++ 中,我們只使用 const 定義常量,而不是用 巨集常量,即,const 常量完全取代巨集常量
#define是巨集定義,程式在預處理階段將用 #define 定義的內容進行了替換。因此程式執行時,常量表中並沒有用#define 定義的常量,系統不為它分配記憶體。const定義的常量,在程式執行時在常量表中,系統為它分配記憶體。#define 的巨集常量在預處理階段就進行了替換,同時不分配記憶體;而 const 定義的常量,會分配在,常量儲存區中
#define定義的常量,預處理時只是直接進行了替換。所以編譯時不能進行資料型別檢驗。const定義的常量,在編譯時進行嚴格的型別檢驗,可以避免出錯。const 定義的常量,有型別檢驗
#define定義表示式時要注意邊緣效應,例如如下定義:
#define n 2+3
// 要記得,#define 的常量,只是進行了符號替換,而不會進行運算
int a = n/2;
// 相當於是 2+3/2,根據運算優先順序,結果是 3
// 這就是巨集定義的字串替換的「邊緣效應」
// 如果想要 n = 5,那麼需要定義的時候
// #define n (2+3)
// 但是,用 const,就不會有這些問題,const 可以幫助直接 計算
const
int m =2+
3;// 那麼此時,m 的常量就是 m = 5
const 定義的常量叫做常變數原因有二:const 定義常量像變數一樣檢查型別;const可以在任何地方定義常量,編譯器對它的處理過程與變數相似,只是分配記憶體的地方不同(const 常量分配記憶體在常量儲存區)。
有時我們希望某些常量只在類中有效。由於#define 定義的巨集常量是全域性的,不能達到目的,於是想當然地覺得應該用 const 修飾資料成員來實現。
const 資料成員只在某個物件生存期內是常量,而對於整個類而言卻是可變的,因為類可以建立多個物件,不同的物件其 const 數
據成員的值可以不同。
不能在類宣告中初始化 const 資料成員。
以下用法是錯誤的,因為類的物件未被建立時,編譯器不知道 size 的值是什麼。
class
a;
const 資料成員的初始化只能在類建構函式的初始化表中進行,例如
classa;
a::a
(int size)
:size
(size)
// 建構函式的初始化表
a a(
100)
;// 物件 a 的 size 值為 100
a b(
200)
;// 物件 b 的 size 值為 200
怎樣才能建立在整個類中都恆定的常量呢?別指望 const 資料成員了,應該用類中的列舉常量來實現。例如
classa;
// 列舉常量
int array1[size1]
;int array2[size2];}
;
列舉常量不會占用物件的儲存空間,它們在編譯時被全部求值。列舉常量的缺點是:
它的隱含資料型別是整數,其最大值有限,且不能表示浮點數
(如 pi=3.14159)。define巨集常量和const常量的區別
define radius 100 const float radius 100 1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行...
define巨集常量和const常量的區別
c 語言可以用const 來定義常量,也可以用 define 來定義常量。但是前者比後者有更多的優點 1 const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤 邊際效應 2 有些整合化的...
define巨集常量和const常量的區別
c 語言可以用const 來定義常量,也可以用 define 來定義常量。但是前者比後者有更多的優點 1 const 常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查。而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換可能會產生意料不到的錯誤 邊際效應 2 有些整合化的...