const的用法有四種:引數、返回值、函式,?另一種沒有想起來
用const修飾變數將限定變數為唯讀,該變數值不允許被改變。下面是const用於定義陣列大小的乙個簡單例子:
const int arraysize = 10;
int array[arraysize];//僅限於c++可以這樣表示。
const變數必須初始化,這個一次性的初始化是設定其數值的唯一機會。
const int i; //錯誤,沒有初始化
const也可以用於修飾指標。例如:
char cha = 'a';
const char chb = 'b';
char *const ptr_1 = &cha; //常指標
const char *ptr_2 = &chb; //指向常量的指標
char const *ptr_3 = &chb; //指向常量的指標
const char *const ptr_4 = &chb; //指向常量的常指標
當const與*並存時,正確區分的原則是:如果const位於*後,則指標本身是不能被修改的(常指標),至於指標所指向的變數,則可能允許被修改;如果const位於*前,則指標所指向的變數不能被修改的,即該指標是指向常量的指標,至於指標本身,則可能允許修改。而const與型別標識的位置關係則無關緊要,所以ptr_2和ptr_3是一樣的。依據這一原則,很容易判斷出下面的操作是否合法。
ptr_1 = &chb; //錯誤
*ptr_1 = chb; //正確
ptr_2 = &cha; //正確
*ptr_3 = cha; //錯誤
ptr_4 = &cha; //錯誤
*ptr_4 = cha; //錯誤
const也可以用於修飾引用,但不能用引用改變所指const變數的值。const定義常量物件的引用,可以用常量初始化,也可以用變數初始化。如果用變數初始化,則引用成為該變數的唯讀別名。也可以用常量表示式初始化const引用,但不可以用常量表示式初始化變數的引用。
const int i = 1;
int j = 2;
const int &m = i;
const int &n = j;
int &k = i + j; //錯誤
const int &p = i + j; //正確
定義本身為常量的引用變數是無意義的(雖然合法),因為所有引用變數自動成為常量(因為一量引用初始化,就不能引用其他變數)。
int n;
int &const k = n; //合法但沒有意義
#include "stdio.h"
#define str1 "this is the first string!\n"
void main(void)
所以使用const還可以節省記憶體空間。
#define t 13 /*用#define定義的乙個常量t*/
int main()
區別:const常量有資料型別, 而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只能進行字元替換,沒有型別
安全檢查。而且字元替換可能會帶來料想不到的邊界效應。
有些整合化工具可以對const常量進行除錯, 但不能對巨集量進行除錯。
1.差別:const與#define最大的差別在於:前者在堆疊分配了空間,而後者只是把具體數值直接傳遞到目標變數罷了,#define不占用記憶體單元,每次呼叫都會分配記憶體。
或者說,const的常量是乙個run-time的概念,他在程式中確確實實的存在可以被呼叫、傳遞。而#define常量則是乙個compile-time概念,它的生命週期止於編譯期:在實際程式中他只是乙個常數、乙個命令中的引數,沒有實際的存在。const常量存在於程式的資料段.#define常量存在於程式的**段。
2優缺點:至於兩者的優缺點,要看具體的情況了。
從執行效率上來說#define是乙個更好的選擇:
i.從run-time的角度來看,他在空間上和時間上都有很好優勢。
ii.從compile-time的角度來看,類似m=t*10的**不會被編譯器優化,t*10的操作需要在run-time執行。而#define的常量會被合併。但是:如果你需要粗魯的修改常數的值,那就的使用const了,因為後者在程式中沒有實際的存在.另外在標頭檔案中使用 #define 可以避免標頭檔案重複包含的問題,這個功能,是const無法取代的
從執行穩健性來說用const會好一些:
在c語言中,還有用於定義常數的巨集#define,它做是值代替(即文字代替),沒有型別檢查工具。而const提供了型別檢查,可以避免值代替時容易出現的一些問題。安全檢查。而且字元替換可能會帶來料想不到的邊界效應。 有些整合化工具可以對const常量進行除錯, 但不能對巨集量進行除錯。所以c++中我們一般提倡用const,c語言就看情況使用了。
const常量與巨集定義區別
1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...
const常量與巨集定義區別
1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...
巨集定義 define 與 const的區別
define radius 100 const float radius 100 1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行...