生活随笔
收集整理的這篇文章主要介紹了
const的一些注意事项
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
今天在繼續(xù)學(xué)習(xí)STL的過程中遇到了一些編譯錯(cuò)誤??匆幌孪旅娴拇a——
class stone
{private:
int weightpublic:stone
(int i
){weight=i
}bool operator<
(const stone& st
){return weight<st.weight
}
}template<
class T>
inline bool
min(const T&
a,const T&
b){return
a<
b?
true:false
}int main
(){stone
a(1)stone
b(2)cout<<
::min(a,b)
}
代碼很簡(jiǎn)單,是關(guān)于函數(shù)模板與重載的一個(gè)test,但是卻報(bào)了這樣的一個(gè)編譯錯(cuò)誤[Error] passing ‘const stone’ as ‘this’ argument of ‘bool stone::operator<(const stone&)’ discards qualifiers [-fpermissive]
原因是我在寫模板時(shí)往往有這樣的一個(gè)編程習(xí)慣 inline bool min(const T& a,const T& b),如果T不是類的話沒有問題,但如果T是一個(gè)類的話,const修飾的對(duì)象只能訪問const函數(shù),而我上面的重載函數(shù)卻恰恰沒有在參數(shù)列表后加上一個(gè)const,導(dǎo)致了這個(gè)錯(cuò)誤。
所以干脆來總結(jié)一下const的注意事項(xiàng)吧——
阻止一個(gè)變量被改變,可以使用 const 關(guān)鍵字。在定義該 const 變量時(shí),通常需要對(duì)它進(jìn)行初始化,因?yàn)橐院缶蜎]有機(jī)會(huì)再去改變它了;對(duì)指針來說,可以指定指針本身為 const,也可以指定指針?biāo)傅臄?shù)據(jù)為 const,或二者同時(shí)指定為 const;在一個(gè)函數(shù)聲明中,const 可以修飾形參,表明它是一個(gè)輸入?yún)?shù),在函數(shù)內(nèi)部不能改變其值;對(duì)于類的成員函數(shù),若指定其為 const 類型,則表明其是一個(gè)常函數(shù),不能修改類的成員變量,類的常對(duì)象只能訪問類的常成員函數(shù);對(duì)于類的成員函數(shù),有時(shí)候必須指定其返回值為 const 類型,以使得其返回值不為“左值”。const 成員函數(shù)可以訪問非 const 對(duì)象的非 const 數(shù)據(jù)成員、const 數(shù)據(jù)成員,也可以訪問 const 對(duì)象內(nèi)的所有數(shù)據(jù)成員;非 const 成員函數(shù)可以訪問非 const 對(duì)象的非 const 數(shù)據(jù)成員、const 數(shù)據(jù)成員,但不可以訪問 const 對(duì)象的任意數(shù)據(jù)成員;一個(gè)沒有明確聲明為 const 的成員函數(shù)被看作是將要修改對(duì)象中數(shù)據(jù)成員的函數(shù),而且編譯器不允許它為一個(gè) const 對(duì)象所調(diào)用。因此 const 對(duì)象只能調(diào)用 const 成員函數(shù)。const 類型變量可以通過類型轉(zhuǎn)換符 const_cast 將 const 類型轉(zhuǎn)換為非 const 類
型;const類型變量必須定義的時(shí)候進(jìn)行初始化,因此也導(dǎo)致如果類的成員變量有const類型的變量,那么該變量必須在類的初始化列表中進(jìn)行初始化;對(duì)于函數(shù)值傳遞的情況,因?yàn)閰?shù)傳遞是通過復(fù)制實(shí)參創(chuàng)建一個(gè)臨時(shí)變量傳遞進(jìn)函數(shù)的,函數(shù)內(nèi)只能改變臨時(shí)變量,但無法改變實(shí)參。則這個(gè)時(shí)候無論加不加 const對(duì)實(shí)參不會(huì)產(chǎn)生任何影響。但是在引用或指針傳遞函數(shù)調(diào)用中,因?yàn)閭鬟M(jìn)去的是一個(gè)引用或指針,這樣函數(shù)內(nèi)部可以改變引用或指針?biāo)赶虻淖兞?#xff0c;這時(shí) const 才是實(shí)實(shí)在在地保護(hù)了實(shí)參所指向的變量。因?yàn)樵诰幾g階段編譯器對(duì)調(diào)用函數(shù)的選擇是根據(jù)實(shí)參進(jìn)行的,所以,只有引用傳遞和指針傳遞可以用是否加 const 來重載。一個(gè)擁有頂層 const 的形參無法和另一個(gè)沒有頂層 const 的形參區(qū)分開來。
總結(jié)
以上是生活随笔為你收集整理的const的一些注意事项的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。