C++中多才多藝的 const
1. 定義一個(gè)常全局變量
const int global = 100; // 初始化之后不可再賦值
這樣的global實(shí)際上是一個(gè)常量,這是C++用來取代宏定義的其中一種措施,const常量有類型檢測(cè),提高編譯器的效率。
2. 定義常指針
這有兩個(gè)版本,分別是:
const int *p1 = &a; // p1不能修改它所指向的目標(biāo) int const *p1 = &a; // p1的另一種等價(jià)形式 int *const p2 = &a; // p2本身不可修改
上述代碼中的p1經(jīng)常被用作函數(shù)參數(shù),用以限制指針的權(quán)限,在安全性方面功不可沒。p2用的很少,我們很少需要一個(gè)本身指向不可變的指針
3. 定義一個(gè)STL的常迭代器
這也有類似的兩個(gè)版本:
vector::const_iterator it1; // it1不能修改它所指代的目標(biāo)對(duì)象 const vector::iterator it2; // it2本身不可修改
由于迭代器實(shí)際上就是廣義指針,因此it1實(shí)際上相當(dāng)于上述代碼的p1,it2相當(dāng)于上述代碼的p2,同理it1用的較多,用來限制迭代器的權(quán)限。
4. 定義一個(gè)類的內(nèi)部常成員
包括常成員數(shù)據(jù)和常成員方法:
class text
{
const int aconst = 100; // 常成員數(shù)據(jù),必須初始化
void func(void) const; // 常成員方法,只能由常對(duì)象調(diào)用
static int astatic;
};
類的常成員數(shù)據(jù)aconst,意味著類對(duì)象無法對(duì)其修改,這個(gè)很容易理解。至于類的常成員方法func就破費(fèi)腦力了,語(yǔ)法上的理解是,func不能修改任何一個(gè)類對(duì)象的bit,這是顯而易見的,這也正是C++標(biāo)準(zhǔn)對(duì)const成員方法的定義。\
來近距離看看func方法的使用:
int text::astatic = 100; // 類外初始化靜態(tài)數(shù)據(jù)
void text::func(void) const // 類外定義const成員方法
{
astatic = 200; // 沒毛病,astatic不是對(duì)象數(shù)據(jù),此處可以被修改
aconst = 200; // 錯(cuò)誤!const型函數(shù)不可修改類對(duì)象數(shù)據(jù)
}
定義如上的成員方法很重要,因?yàn)樗鞔_地告訴了類的使用者,哪些函數(shù)可以修改類對(duì)象信息,哪些不會(huì)修改類對(duì)象信息。
像 func() 這樣的函數(shù)const成員方法,只能被常對(duì)象調(diào)用,以確保不違反權(quán)限緊縮原則,比如:
text t1; // 普通對(duì)象t1 const text t2; // const型對(duì)象t2 t1.func(); // 錯(cuò)誤!普通對(duì)象不可調(diào)用常成員方法 t2.func();
注意:函數(shù)本體的const屬性是可以被視為重載的依據(jù)的,換句話說如果以上類text提供了non-const版本的func函數(shù),那么t1將會(huì)自動(dòng)調(diào)用non-const那個(gè)版本。
以上陳述似乎平淡乏味,但考慮C++語(yǔ)法規(guī)定的這種bit-wise特性的常成員在處理類成員指針,并且指針指向類外部?jī)?nèi)存時(shí),情況也許會(huì)變得有趣。
5. bit-wise和logical-wise常特性
所謂bit-wise constness指的是類對(duì)象的內(nèi)部?jī)?nèi)存意義上只讀約束,而loigcal-wise指的是邏輯意義上的只讀約束。編譯器沒有智能,它只能實(shí)現(xiàn)bit-wise意義上的約束,下面的例子討論const成員 operator[ ] 的表現(xiàn)可以幫助理解:
class text
{
... ...
char &operator[ ](int pos) const;
private:
char *p;
};
// const關(guān)鍵字保證了該成員方法只能被 const 對(duì)象調(diào)用
char &text::operator[ ](int pos) const
{
return p[pos];
}
上述代碼中,類text存儲(chǔ)真正字符串的地方是指針 p 指向的內(nèi)存區(qū)域,假設(shè)此時(shí)定義一個(gè) const 型的常對(duì)象,那么它只能保證類內(nèi)部信息(也就是p本身)不被修改,卻無法保證其所指向的內(nèi)存區(qū)域的安全性。來看下面的代碼:
const text ct("abcd");
ct[0] = 'A'; // 一個(gè)被編譯器允許卻跟邏輯相悖的語(yǔ)句
此處ct是一個(gè)const型對(duì)象,從字面理解出發(fā),我們應(yīng)該認(rèn)為ct對(duì)象是一個(gè)常量,我們應(yīng)該無法通過任何方式修改其內(nèi)部信息,但可惜,ct里面的字符串信息實(shí)際上并不存在在類內(nèi)存區(qū)域中,于是就出現(xiàn)了可以對(duì)一個(gè)const型對(duì)象進(jìn)行賦值的有趣現(xiàn)象。
解決以上問題也不難,可以改寫 operator[ ] 成員方法的返回值類型:
const char &operator[ ](int pos) const;
此時(shí)就再也不能對(duì) ct[0] 賦值了,但這只是個(gè)個(gè)例,關(guān)鍵我們要掌握的內(nèi)容是:如果我們的類對(duì)象擁有成員指針,那么一般意義上的const成員方法只能保證bits-wise的常量性(即保證類對(duì)象內(nèi)部的內(nèi)存信息不被修改),但無法保證所謂的 logical-wise的常量性(即保證邏輯上哪些信息不被修改)。
到此這篇關(guān)于C++中的 const的文章就介紹到這了,更多相關(guān)C++中的const內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實(shí)現(xiàn)控制臺(tái)隨機(jī)迷宮的示例代碼
本文主要介紹了C++實(shí)現(xiàn)控制臺(tái)隨機(jī)迷宮的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
教你如何使用C++ 統(tǒng)計(jì)地鐵中站名出現(xiàn)的字的個(gè)數(shù)
通過本文教大家如何使用C++ 統(tǒng)計(jì)地鐵中站名出現(xiàn)的字的個(gè)數(shù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2022-01-01
C++JSON庫(kù)CJsonObject詳解(輕量簡(jiǎn)單好用)
CJsonObject是基于cJSON全新開發(fā)一個(gè)C++版的JSON庫(kù),CJsonObject的最大優(yōu)勢(shì)是輕量簡(jiǎn)單好用,開發(fā)效率極高,對(duì)多層嵌套json的讀取和生成使用非常簡(jiǎn)單,喜歡的朋友一起看看吧2021-04-04
C++用函數(shù)對(duì)算法性能進(jìn)行測(cè)試
算法無處不在,算法是程序的靈魂,而數(shù)據(jù)結(jié)構(gòu)則是程序的骨架,二者共同構(gòu)成了程序,那么如何評(píng)估算法的性能呢?理論上可以通過計(jì)算時(shí)間復(fù)雜度的方法來評(píng)估,但這是理性的認(rèn)識(shí),我們還有一種直觀的評(píng)估方法,那就是程序執(zhí)行的時(shí)間2022-08-08
海量數(shù)據(jù)處理系列之:用C++實(shí)現(xiàn)Bitmap算法
本篇文章是對(duì)用C++實(shí)現(xiàn)Bitmap算法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
???????C語(yǔ)言實(shí)現(xiàn)單鏈表基本操作方法
這篇文章主要介紹了???????C語(yǔ)言實(shí)現(xiàn)單鏈表基本操作方法,文章圍繞主題展開詳細(xì)介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-05-05

