常量(const 和 define 的區別)

2021-10-07 16:34:22 字數 2215 閱讀 8123

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

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

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

常量,就是我們希望在整個**中,這個量不能改變,所以用 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 有些整合化的...