常量:
用宏表示常數
假如我們要寫一個有關圓的種種計算的程式,那麼∏(3.14159)值會被瀕繁用到。我們顯然沒有理由去改∏的值,所以應該將它當成一個常量對待,那麼,我們是否就不得不一遍一遍地寫3.14159這一長串的數呢?這就用到了宏。宏不僅可以用來代替常數值,還可以用來代替運算式,甚至是程式碼片段。宏的文法為:
#define 宏名稱 宏值
比如要代替前面說到的∏值,應為:#define PAI 3.14159注意,宏定義不是C或C++嚴格意義上的語句,所以其行末不用加分號結束。宏名稱的取名規則和變數名一樣,所以我們這裡用PAI來表示∏,因為C、C++不能直接使用∏字元。有了上面的語句,我們在程式中凡是要用到3.14159的地方都可以使用PAI這個宏來取代。宏名稱經常使用全部大寫的字母。假設原來有一段代碼:double zc = 2 * 3.14159 * R; //求圓周長,其中R是代表半徑的變數double mj = 3.14159 * R * R; //求圓面積
在定義了宏PAI以後,我們就可以這樣使用:
#define PAI 3.14159
double = 2 * PAI * R; //求圓周長,其中R是代表半徑的變數
double = PAI * R * R; //求圓面積
用宏來取代常數,好處是:
1)讓代碼更簡潔明了
當然,這有賴於你為宏取一個適當的名字。一般來說,宏的名字更要注重有明確直觀的意義,有時寧可讓它長點。
2)方便代碼維護
就如前面說的3.14159。哪天你發現這個∏值精度不夠,想改為3.1415926,那麼你只修改一處宏,而不是修改代碼中的所有宏。
原來的宏:
#define PAI 3.14159
修改後的宏:
#define PAI 3.1415926
對宏的處理,在編譯過程中稱為“預先處理”。也就是說在正式編譯前,編譯器必須先將代碼出現的宏,用其相應的宏值替換,這個過程有點你我在文文書處理軟體中的尋找替換。完成預先處理後,所有原來的“PAI”都成了立即數3.1415926。所以在代碼中使用宏表達常數,歸根結底還是使用了立即數,並沒有明確指定這個量的類型。這容易帶來一些問題,所以C++使用另一更穩妥的方法來代替宏的這一功能。
const 資料類型 常量名 = 常量值;
相比變數定義的格式,常量定義必須以 const 開始,另外,常量必須在定義的同時,完成賦值。
const float PAI = 3.1415926; (注意分號)
const 的作用就是指明這個量(PAI)是常量,而非變數。
常量必須一開始就指定一個值,然後,在以後的代碼中,我們不允許改變PAI的值,比如:
const float PAI = 3.14159;
double zc = 2 * PAI * R;
PAI = 3.1415926; //錯誤!,PAI不能再修改。
double mj = PAI * R * R;
如果一個常量是整型,可以省略指出資料類型,如:
const k = 100;
相當於
const int k = 100;
反過來說,如果不指定資料類型,則編譯器將它當成整型。比如:
const k = 1.234;
雖然你想讓k等於一個實型數,然而,最終k的值其實是1。因為編譯器把它當成整型常量。
我們建議在定義變數時,明確指出類型,不管它是整型或其它類型。
const int i = 100;
const double di = 100.0;
const 與#define
#define定義的其實是一個常數的名字,就是說你可以把這個名字等價於常數使用,在編譯時間會被編譯器替換為該常數。之所以這麼做,僅僅是為了提高可讀性,但是安全性不能得到保證。
出於安全性的考慮,c++引入了const定義。當然這僅僅是const的功能之一。使用const,你可以定義一個不能修改其值的變數,也就是可以作為一個常量來使用了。當然,這個量與100,\'a\'等還是有區別的。區別就在於這個量有自己的記憶體位址,是被分配了空間的。
總的說來,#define 沒有給名字分配空間,僅僅是給一個常數起了一個名字。而const定義了一個其值不能修改的變數,在記憶體中是有自己的地址的