摘自:
物件導向是c++的重要特性,但是c++在c的基礎上新增加的幾點優化也是很耀眼的 。
以下幾點很重要,學不好後果會很嚴重
const 限定符
1. 宣告變數只能被讀
const int i=5;
int j=0;
...
i=j; //非法,導致編譯錯誤
j=i; //合法
2. 必須初始化
const int i=5; //合法
const int j; //非法,導致編譯錯誤
3. 在另一連線檔案中引用const常量
extern const int i; //合法
extern const int j=10; //非法,常量不可以被再次賦值
4. 便於進行型別檢查
用const方法可以使編譯器對處理內容有更多了解。
#define i=10
const long &i=10;
char h=i; //沒有錯
char h=i; //編譯警告,可能由於數的截短帶來錯誤賦值。
5. 可以避免不必要的記憶體分配
#define string "abcdefghijklmn/n"
const char string="abcdefghijklm/n";
...
printf(string); //為string分配了第一次記憶體
printf(string); //為string一次分配了記憶體,以後不再分配
...
printf(string); //為string分配了第二次記憶體
printf(string);
...
由於const定義常量從彙編的角度來看,只是給出了對應的記憶體位址,
而不是象#define一樣給出的是立即數,所以,const定義的常量在
程式執行過程中只有乙份拷貝,而#define定義的常量在記憶體中有
若干個拷貝。
6. 可以通過函式對常量進行初始化
int value();
const int i=value();
假定對rom編寫程式時,由於目標**的不可改寫, 本語句將會無效,不過可以變通一下:
const int &i=value();
只要令i的位址處於rom之外,即可實現:i通過函式初始化,而其值不會被修改。
7. 是不是const的常量值一定不可以被修改呢?
觀察以下一段**:
const int i=0;
int *p=(int*)&i;
p=100;
通過強制型別轉換,將位址賦給變數,再作修改即可以改變const常量值。
8. 請分清數值常量和指標常量,以下宣告頗為玩味:
int ii=0;
const int i=0; //i是常量,i的值不會被修改
const int *p1i=&i; //指標p1i所指內容是常量,可以不初始化
int * const p2i=ⅈ //指標p2i是常量,所指內容可修改
const int * const p3i=&i; //指標p3i是常量,所指內容也是常量
p1i=ⅈ //合法
*p2i=100; //合法
上面只提到了const的部分用法,具體請參看上方的**。
const關鍵字用法
1 const常量 如const int max 100 優點 const常量有資料型別,而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只進行字元替換,沒有型別安全檢查,並且在字元替換時可能會產生意料不到的錯誤 邊際效應 2 const修飾類的資料成員 class a const...
const關鍵字用法
const修飾符表示該變數的值不能被改變。但得分兩種情況討論 修飾普通變數和修飾指標變數。1.普通常量 const int foo 5 表示foo不能再被賦值 foo 8 錯誤,因為foo是const修飾為不可變常量了 2.修飾指標 const char p test 表示p指向 的記憶體不可改變,...
關鍵字const詳解
關鍵字const 1 用關鍵字const定義變數指所定義的常量。即恆定的變數,即不可改變的變數。例 const int i 10 此時 i 就是乙個整型的常量,其值不能改變。在c 中如果用const定義乙個物件,那麼物件中的成員變數就是常數,不能改變 只能為初始化的值 如果用const定義類中的成員...