const的位置
//****************************整型常量************************** const int a=1;//必須賦初始值 int const b=2;//必須賦初始值;完全等價於 const int b=2; //const int c; int const d;//錯誤;必須有初始值 //a=9+3; b=12;//不允許再進行賦值//***********************常量指標***************************** int s=12; const int *iptr;//常量指標;可以不賦初始值 //const修飾的是int,而int定義的是一個整型值。因此*iptr所指向的對象的值不能通過*iptr來修改,但是可以重新給iptr來賦值,使其指向不同的對象 iptr=&a; iptr=&b; iptr=&s; //*iptr=123;錯誤。 //常量指標與普通指標的區別只有一個,就是不能通過*ptr來間接地修改s的值。 //********************指標常量********************* int* const ptr=&s;//指標常量(想想整型常量);必須賦初始值;且初始值賦&a後&b都是錯誤的 //const修飾的是ptr,ptr代表的是一個指標地址,因此不能賦給ptr其他的地址值,但可以修改ptr所指向的值 //ptr=&s;//指標不允許再賦值 *ptr=123;//成功。 //指標常量與整型常量的差別:可以通過*ptr來間接地修改s的值
const的修飾對象
看到const 關鍵字,C++程式員首先想到的可能是const 常量。這可不是良好的條件反射。如果只知道用const 定義常量,那麼相當於把火藥僅用於製作鞭炮。const 更大的魅力是它可以修飾函數的參數、傳回值,甚至函數的定義體。
const輸入參數
如果參數作輸出用,不論它是什麼資料類型,也不論它採用“指標傳遞”還是“引用傳遞”,都不能加 const 修飾,否則該參數將失去輸出功能。const 只能修飾輸入參數。
如果輸入參數採用“值傳遞”,由於函數將自動產生臨時變數用於複製該參數,該輸入參數本來就無需保護,所以不要加const 修飾。
“引用傳遞”有可能改變參數a,這是我們不期望的。解決這個問題很容易,加const修飾即可,因此函數最終成為void Func(const A &a)
const傳回值
如果給以“指標傳遞”方式的函數傳回值加const 修飾,那麼函數傳回值(即指標)的內容不能被修改,該傳回值只能被賦給加const 修飾的同類型指標。
函數傳回值採用“引用傳遞”的場合并不多,這種方式一般只出現在類的賦值函數中,目的是為了實現鏈式表達。
const成員變數
1.static const int b=234;//只有靜態常量變數才可以在類中初始化
2.類的const常量只能在初始化表裡被初始化,因為它不能在函數體內用賦值的方式來初始化
3.類中的常量:怎樣才能建立在整個類中都恒定的常量呢?別指望const資料成員了,應該用類中的枚舉常量來實現。例如
class A
{…
enum { SIZE1 = 100, SIZE2 = 200}; // 枚舉常量
int array1[SIZE1];
int array2[SIZE2];
};
枚舉常量不會佔用對象的儲存空間,它們在編譯時間被全部求值。枚舉常量的缺點是:它的隱含資料類型是整數,其最大值有限,且不能表示浮點數(如PI=3.14159)。
const成員函數
聲明:<類型標誌符> 函數名(參數表)const;
- const是函數類型的一部分,在實現部分也要帶該關鍵字。Eg:int A::getValue() const
{}
- const關鍵字可以用於對重載函數的區分。
- 常成員函數不能更新類的成員變數,也不能調用該類中沒有用const修飾的成員函數,只能調用常成員函數。