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