C/C++中CONST用法總結(jié)(推薦)
1、修飾常量時:
const int temp1; //temp1為常量,不可變 int const temp2; //temp2為常量,不可變
2、修飾指針時:
主要看const在*的前后,在前則指針指向的內(nèi)容為常量,在后則指針本身為常量;
const int *ptr; //*ptr為常量; int const *ptr; //*ptr為常量; int* const ptr; //ptr為常量; const int * const ptr; //*ptr、ptr均為常量;
3、const修飾類對象時:
const修飾類對象時,其對象中的任何成員都不能被修改。const修飾的對象,該對象的任何非const成員函數(shù)都不能調(diào)用該對象,因為任何非const成員函數(shù)都會有修改成員變量的可能。
class TEMP{ void func1(); void func2() const; } const TEMP temp; temp.func1(); //錯誤; temp.func2(); //正確;
4、const修飾成員變量:
const修飾的成員變量不能被修改,同時只能在初始化列表中被初始化,因為常量只能被初始化,不能被賦值;
賦值是使用新值覆蓋舊值構(gòu)造函數(shù)是先為其開辟空間然后為其賦值,不是初始化;而初始化列表開辟空間和初始化是同時完成的,直接給與一個值,所以const成員變量一定要在初始化列表中完成。
class TEMP{ const int val; TEMP(int x)val(x){}; //只能在初始化列表中賦值; }
5、const修飾類的成員函數(shù)
const成員函數(shù)表示該成員函數(shù)不能修改類對象中的任何非const成員變量。一般const寫在函數(shù)的后面,形如:void func() const;
如果某個成員函數(shù)不會修改成員變量,那么最好將其聲明為const,因為const成員函數(shù)不會對數(shù)據(jù)進行修改,如果修改,編譯器將會報錯;
class TEMP{ void func()const; //常成員函數(shù),不能修改對象中的成員變量,也不能調(diào)用類中任何非const成員函數(shù); }
對于const類對象,只能調(diào)用類中的const成員函數(shù),所以const修飾成員函數(shù)的作用主要就是限制對const對象的使用。
6、const在函數(shù)聲明中的使用:
在函數(shù)聲明中,const可以修飾函數(shù)的返回值,也可以修飾具體某一個形參;
修飾形參時,用相應(yīng)的變量初始化const常量,在函數(shù)體內(nèi),按照const所修飾的部分進行常量化;
修飾函數(shù)返回值時,一般情況下,const修飾返回值多用于操作符的重載。通常不建議用const修飾函數(shù)的返回值類型為某個對象或某個對象引用的情況;
7、const常量與define宏定義的區(qū)別:
1)處理階段不同:
define是在預(yù)處理階段,define常量從未被編譯器看見,因為在預(yù)處理截斷就已經(jīng)替換了;
const常量在編譯階段使用。
2)類型和安全檢查不同
define沒有類型,不做任何檢查,僅僅是字符替換,沒有類型安全檢查,并且在字符替換時可能會產(chǎn)生意料不到的錯誤
const常量有明確的類型,在編譯階段會進行類型檢查;
3)存儲方式不同
define是字符替換,有多少地方使用,就會替換多少次,不會分配內(nèi)存;
編譯器通常不會為const常量分配空間,只是將它們保存在符號表內(nèi),使他們成為一個編譯期間的一個常量,沒有讀取內(nèi)存的操作,效率也很高;
8、mutable關(guān)鍵字:
在C++中,mutable是為了突破const的限制而設(shè)置的。被mutable修飾的變量,將永遠處于可變的狀態(tài),即使在一個const函數(shù)中,甚至結(jié)構(gòu)體變量或者類對象為const,其mutable成員也可以被修改:
class ST { public: int a; mutable int showCount; void Show()const; }; void ST::Show()const{ //a=1;//錯誤,不能在const成員函數(shù)中修改普通變量 showCount++;//正確 }
mutable只能修飾非靜態(tài)數(shù)據(jù)成員;
9、const_cast:
用于修改類型的const或volatile屬性。
用法:
:const_cast<type_id> (expression)
該運算符用來修改類型的const或volatile屬性。除了const 或volatile修飾之外, type_id和expression的類型是一樣的。
1)常量指針被轉(zhuǎn)化成非常量的指針,并且仍然指向原來的對象;
2)常量引用被轉(zhuǎn)換成非常量的引用,并且仍然指向原來的對象;
3)const_cast一般用于修改底指針。如const char *p形式。
建議:
1、應(yīng)該盡可能使用const,它會允許你指定一個語義約束(也就是指定一個不能被改動的對象),而編譯器會強制實施這項約束。它允許你告訴編譯器和其他程序員某值應(yīng)該保持不變。
2、將某些東西聲明為const可幫助編譯器偵測出錯誤用法。const可被施加于任何作用域內(nèi)的對象、函數(shù)參數(shù)、函數(shù)返回類型、成員函數(shù)本體;
3、編譯器強制實施bitwise constness,但你編寫程序時應(yīng)該使用“概念上的常量性”(conceptual constness);
4、當const和non_const成員函數(shù)有著實質(zhì)等價的實現(xiàn)時,令non-const版本調(diào)用const版本可避免代碼重復(fù);
以上所述是小編給大家介紹的C/C++中CONST用法總結(jié),希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對我們網(wǎng)站的支持!
上一篇:IOS開發(fā)之UIScrollView實現(xiàn)圖片輪播器的無限滾動
欄 目:C語言
下一篇:C++中鏈表操作實例分析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/1365.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對數(shù)怎么表達
- 04-02c語言沒有round函數(shù) round c語言
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10使用C++實現(xiàn)全排列算法的方法詳解
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10delphi制作wav文件的方法