C++中多才多藝的 const
1. 定義一個常全局變量
const int global = 100; // 初始化之后不可再賦值
這樣的global
實際上是一個常量,這是C++用來取代宏定義的其中一種措施,const
常量有類型檢測,提高編譯器的效率。
2. 定義常指針
這有兩個版本,分別是:
const int *p1 = &a; // p1不能修改它所指向的目標(biāo) int const *p1 = &a; // p1的另一種等價形式 int *const p2 = &a; // p2本身不可修改
上述代碼中的p1經(jīng)常被用作函數(shù)參數(shù),用以限制指針的權(quán)限,在安全性方面功不可沒。p2用的很少,我們很少需要一個本身指向不可變的指針
3. 定義一個STL的常迭代器
這也有類似的兩個版本:
vector::const_iterator it1; // it1不能修改它所指代的目標(biāo)對象 const vector::iterator it2; // it2本身不可修改
由于迭代器實際上就是廣義指針,因此it1實際上相當(dāng)于上述代碼的p1,it2相當(dāng)于上述代碼的p2,同理it1用的較多,用來限制迭代器的權(quán)限。
4. 定義一個類的內(nèi)部常成員
包括常成員數(shù)據(jù)和常成員方法:
class text { const int aconst = 100; // 常成員數(shù)據(jù),必須初始化 void func(void) const; // 常成員方法,只能由常對象調(diào)用 static int astatic; };
類的常成員數(shù)據(jù)aconst
,意味著類對象無法對其修改,這個很容易理解。至于類的常成員方法func
就破費腦力了,語法上的理解是,func
不能修改任何一個類對象的bit,這是顯而易見的,這也正是C++標(biāo)準(zhǔn)對const
成員方法的定義。\
來近距離看看func方法的使用:
int text::astatic = 100; // 類外初始化靜態(tài)數(shù)據(jù) void text::func(void) const // 類外定義const成員方法 { astatic = 200; // 沒毛病,astatic不是對象數(shù)據(jù),此處可以被修改 aconst = 200; // 錯誤!const型函數(shù)不可修改類對象數(shù)據(jù) }
定義如上的成員方法很重要,因為它明確地告訴了類的使用者,哪些函數(shù)可以修改類對象信息,哪些不會修改類對象信息。
像 func()
這樣的函數(shù)const
成員方法,只能被常對象調(diào)用,以確保不違反權(quán)限緊縮原則,比如:
text t1; // 普通對象t1 const text t2; // const型對象t2 t1.func(); // 錯誤!普通對象不可調(diào)用常成員方法 t2.func();
注意:函數(shù)本體的const
屬性是可以被視為重載的依據(jù)的,換句話說如果以上類text提供了non-const
版本的func
函數(shù),那么t1將會自動調(diào)用non-const
那個版本。
以上陳述似乎平淡乏味,但考慮C++語法規(guī)定的這種bit-wise
特性的常成員在處理類成員指針,并且指針指向類外部內(nèi)存時,情況也許會變得有趣。
5. bit-wise和logical-wise常特性
所謂bit-wise constness
指的是類對象的內(nèi)部內(nèi)存意義上只讀約束,而loigcal-wise
指的是邏輯意義上的只讀約束。編譯器沒有智能,它只能實現(xiàn)bit-wise
意義上的約束,下面的例子討論const
成員 operator[ ]
的表現(xiàn)可以幫助理解:
class text { ... ... char &operator[ ](int pos) const; private: char *p; }; // const關(guān)鍵字保證了該成員方法只能被 const 對象調(diào)用 char &text::operator[ ](int pos) const { return p[pos]; }
上述代碼中,類text存儲真正字符串的地方是指針 p 指向的內(nèi)存區(qū)域,假設(shè)此時定義一個 const
型的常對象,那么它只能保證類內(nèi)部信息(也就是p本身)不被修改,卻無法保證其所指向的內(nèi)存區(qū)域的安全性。來看下面的代碼:
const text ct("abcd"); ct[0] = 'A'; // 一個被編譯器允許卻跟邏輯相悖的語句
此處ct是一個const
型對象,從字面理解出發(fā),我們應(yīng)該認(rèn)為ct對象是一個常量,我們應(yīng)該無法通過任何方式修改其內(nèi)部信息,但可惜,ct里面的字符串信息實際上并不存在在類內(nèi)存區(qū)域中,于是就出現(xiàn)了可以對一個const型對象進行賦值的有趣現(xiàn)象。
解決以上問題也不難,可以改寫 operator[ ] 成員方法的返回值類型:
const char &operator[ ](int pos) const;
此時就再也不能對 ct[0] 賦值了,但這只是個個例,關(guān)鍵我們要掌握的內(nèi)容是:如果我們的類對象擁有成員指針,那么一般意義上的const
成員方法只能保證bits-wise
的常量性(即保證類對象內(nèi)部的內(nèi)存信息不被修改),但無法保證所謂的 logical-wise
的常量性(即保證邏輯上哪些信息不被修改)。
到此這篇關(guān)于C++中的 const的文章就介紹到這了,更多相關(guān)C++中的const內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
解析如何在C語言中調(diào)用shell命令的實現(xiàn)方法
本篇文章是對如何在C語言中調(diào)用shell命令的方法進行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05C++實現(xiàn)獲取系統(tǒng)時間的方法小結(jié)
這篇文章主要為大家詳細(xì)介紹了使用C++實現(xiàn)獲取系統(tǒng)時間的一些常用方法,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,有需要的小伙伴可以了解下2024-03-03Windows系統(tǒng)下使用C語言編寫單線程的文件備份程序
這篇文章主要介紹了Windows系統(tǒng)下使用C語言編寫單線程的文件備份程序,文中給出了實現(xiàn)的幾個關(guān)鍵代碼片段,剩下的只要套上main和線程調(diào)用的相關(guān)函數(shù)即可,非常詳細(xì),需要的朋友可以參考下2016-02-02