首先說明一下使用const的好處:
使用const的好處在于它允許指定一種語意上的約束------某種對象不能被修改--------編譯器具體來實
施這種約束。通過const,你可以通知編譯器和其他程序員某個值要保持不變。只要是這種情況,你就要
明確地使用const ,因為這樣做就可以借助編譯器的幫助確保這種約束不被破壞。
(一)
首先解釋一下const與指針的關系:
const在指針的聲明中有一下三種形式:
const char *p = "hello"; // 非const指針,
// const數據,就是說p指向的那個內存空間的數據是不可
變的,但p還可以指向新的內存地址。
char * const p = "hello"; // const指針,
// 非const數據,就是說這個指針p一旦賦值或初始化,就
不能在指向其他位置了,但其指向的位置的數據值是可變的。
const char * const p = "hello"; // const指針,
// const數據,這個就很明顯了,集上述兩家之長處(也
可能是短處哦,),上述兩者都不可變。
一般來說,你可以在頭腦里畫一條垂直線穿過指針聲明中的星號(*)位置,如果const出現在線的左邊,
指針指向的數據為常量;如果const出現在線的右邊,指針本身為常量;如果const在線的兩邊都出現,二
者都是常量。
恩,差點忘了,還有一種形式:
char const * p = "hello";
這其實與上邊的情形一是一樣的,只是由于個人習慣的不同,二者都是對的。
(二)
在一個函數聲明中,const可以指的是函數的返回值,或某個參數;對于成員函數,還可以指的是整個函
數。
const(1) int fun(int const(2)& )const(3)
{
int temp;
retrun temp;
}
參數的 const屬性(上例2處)一般用引用傳遞,是為了保證該參數在函數中不允許被修改,一旦修改,
編譯器會報錯。
而返回值的const屬性(上例1處)是保證函數的返回值不被修改,也許你會質疑這種可能性,但是這種可
能性確實存在,
詳細情形如下:(摘自effective c++)
const rational operator*(const rational& lhs,
const rational& rhs);
很多程序員第一眼看到它會納悶:為什么operator*的返回結果是一個const對象?因為如果不是這樣,用
戶就可以做下面這樣的壞事:
rational a, b, c;
...
(a * b) = c; // 對a*b的結果賦值
我不知道為什么有些程序員會想到對兩個數的運算結果直接賦值,但我卻知道:如果a,b和c是固定類型
,這樣做顯然是不合法的。一個好的用戶自定義類型的特征是,它會避免那種沒道理的與固定類型不兼容
的行為。對我來說,對兩個數的運算結果賦值是非常沒道理的。聲明operator*的返回值為const可以防止
這種情況,所以這樣做才是正確的。
呵呵,象Scott Meyers這樣的大師見地就是不一般吧
接下來說明函數的const屬性:(上例3處)
當然嘍,一般用于成員函數了,它有以下屬性:
(1)const成員函數不被允許修改它所在對象的任何一個數據成員。
(2)const成員函數能夠訪問對象的const成員,而其他成員函數不可以。
(三)盡量使用 const代替define 吧,因為const是類型安全的。
應該使用
const double pi = 3.1415926;
而不要用#define pi 3.1415926
后者是宏,僅僅是對程序中的pi用3.1415926代替,會讓你對于一些編譯時的錯誤很難定位。