




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、C+語言中const關(guān)鍵字用法總結(jié) 一、const是什么在 C/C+ 語言中,const關(guān)鍵字是一種修飾符。所謂“修飾符”,就是在編譯器進(jìn)行編譯的過程中,給編譯器一些“要求”或“提示”,但修飾符本身,并不產(chǎn)生任何實(shí) 際代碼。就 const 修飾符而言,它用來告知編譯器,被修飾的這些東西,具有“只讀”的特點(diǎn)。在編譯的過程中,一旦我們的代碼試圖去轉(zhuǎn)變這些東西,編譯器就應(yīng)該給出錯(cuò)誤提示。所以,const修飾符的作用主要是利用編譯器幫助我們檢查自己代碼的正確性。我們使用const在源碼中標(biāo)示出“不應(yīng)該轉(zhuǎn)變”的地 方,然后利用編譯器,幫助我們檢查這些地方是否真的沒有被轉(zhuǎn)變過。如果我們不當(dāng)心去修改了這些地
2、方,編譯器就會報(bào)錯(cuò),從而幫助我們訂正錯(cuò)誤。使用 const和不使用const,對于最終編譯產(chǎn)生的代碼并沒有影響。雖然const對于最終代碼沒有影響,但是盡可能使用const,將幫助我們避開很多錯(cuò)誤,提高程序正確率。二、const可以修飾哪些對象在上面已經(jīng)提到過了,const是一種修飾符,那它可以作為哪些對象的修飾符呢?下面列舉了一些C/C+中用到const的地方。1,const變量2,const指針3,const引用4,const類5,類的const成員變量6,類的const成員函數(shù)7,const修飾函數(shù)的形參加返回值下面我們分別商量上面幾種情況下,const的用法。三、const與變量當(dāng)一個(gè)
3、變量被const修飾后,具有以下幾個(gè)特點(diǎn):1)該變量只能讀取不能修改。(編譯器進(jìn)行檢查)2)定義時(shí)必須初始化。3)C+中喜愛用const來定義常量,取代原來C風(fēng)格的預(yù)編譯指令define。1 const int var; / Error:常量 變量"var"需要初始化設(shè)定項(xiàng)2 const int var1 = 42;3 var1 = 43; / Error:表達(dá)式必須是可以修改的左值上面代碼中第一行和第三行都有錯(cuò)誤,注釋便是編譯器給出的錯(cuò)誤提示。另外注意,在使用const變量作為數(shù)組的下標(biāo)時(shí),變量的值肯定要是一個(gè)常量表達(dá)式(在編譯階段就能計(jì)算得到結(jié)果)。1 const in
4、t sz = 42;2 int iArsz;3 const int sz1 = size(); / size()必須是一個(gè)返回常量的函數(shù)4 int iAr1sz1;5 6 int var = 42;7 const int sz2 = var;8 int iAr2sz2; / error:sz2只有運(yùn)行時(shí)才知道值四、const與引用我們知道,引用必須在定義的時(shí)候賦值,這樣就會所引用的變量綁定在一起并作為它的一個(gè)別名,在程序中的其他地方,是不能讓引用再與其他對象綁定。這個(gè)特性,讓引用看起來就像是const對象一樣,一旦定義后將不能更改。所以并不存在const的引用。但是我們卻可以引用一個(gè)const
5、的對象(變量),我們稱之為對常量的引用,與一般的引用不同的時(shí),對常量的引用不能被用作修改它所綁定的對象。1 const int ci = 1024;2 const int &r1 = ci;3 r1 = 42; / Error:r1是對常量的引用4 int & r2 = ci; /Error:不能將一個(gè)特別量引用指向一個(gè)常量的對象我們知道,引用的類型必須與其所引用對象的類型全都,如下面的代碼:double dval = 3.14;int& ri = dval; / Error:無法用double類型的值初始化int&類型的引用(特別量限定)上述代碼為何不行?此處
6、ri引用了一個(gè)int型的整數(shù)。對于ri的操作數(shù)應(yīng)該是整數(shù)運(yùn)算,但是dval卻是一個(gè)雙精度的浮點(diǎn)數(shù)而非整數(shù)。因此為了確保讓ri綁定一個(gè)整數(shù),編譯器把上述代碼變成了如下形式:double dval = 3.14;int temp = dval;int& ri = temp;其中temp是一個(gè)臨時(shí)變量,而ri綁定了一個(gè)臨時(shí)量,所以當(dāng)ri轉(zhuǎn)變時(shí),并沒有轉(zhuǎn)變davl的值,所以這種引用是無效的。也許你注意到了,當(dāng)我們把double變量綁定在一個(gè)int&類型上時(shí),編譯器提示后有個(gè)括號:特別量限定。這說明如果是一個(gè)常量的引用,則有可能是通過的,顯然下面的代碼就沒有任何問題:double dva
7、l = 3.14;const int& ri = dval;由于在這里,ri是一個(gè)常量引用,我們并不想通過ri轉(zhuǎn)變dval的值,只要能讀到dval對應(yīng)的int型的值就行。五、const與指針 我們知道,指針與引用不同,指針本身是一個(gè)對象,所以存在常量指針,這種指針在定義并初始化后,便不能再指向其他變量。用來修飾這種常量指針的const,我們稱之為"頂層const"。與頂層指針對應(yīng)的是底層指針,這種指針指向一個(gè)const修改的對象,這一點(diǎn)上就有點(diǎn)像是常量的引用。對于指向常量的指針或引用,都有以下規(guī)章:1)可以將一個(gè)非const對象的地址賦給一個(gè)指向const
8、對象的指針2)可以將一個(gè)非const對象的地址賦給一個(gè)指向非const對象的指針3)可以將一個(gè)const對象的地址賦給一個(gè)指向const對象的指針4)不行以將一個(gè)const對象的地址賦給一個(gè)指向const對象的指針。1 int var;2 const int ci = 42;3 4 int *p1 =& var;5 int *p2 = &ci; / Error,const int* 不能用于初始化int*6 const int *p3 = &var; /ok7 const int *p4 = &ci; / ok 還有一種指向const對象的const指
9、針,這種指針首先表明,本身是一個(gè)const指針,一旦初始化后不能指向其他對象;其次,它本身所指向的對象也是一個(gè)常量,即不能通過指針修改對象的值。const int var = 42;const int* const p = &var;這里再強(qiáng)調(diào)一點(diǎn),const只是給編譯器看的,我們可以很輕松的騙過編譯器,并看看編譯器都做了什么:1 const int var = 42;2 int* p = (int*)&var;3 *p = 20;4 cout << var << endl; /425 cout << *p << endl; /2
10、0我們在代碼的第2行,用一個(gè)類型轉(zhuǎn)換強(qiáng)制的,把一個(gè)非const指針指向了一個(gè)const對象。但是后面我們通過這個(gè)指針來修改這個(gè)值,卻沒有生效,緣由呢?那是由于編譯器在編譯階段發(fā)現(xiàn)var是一個(gè)常量,所以在編譯目標(biāo)代碼時(shí)已經(jīng)將var的地方都用42進(jìn)行了替換。六、const與類其實(shí)類定義的對象,與一般的變量是一樣的,用const修飾時(shí),說明這個(gè)類是一個(gè)常量類對象,這個(gè)對象有下面2個(gè)特點(diǎn):1)不能轉(zhuǎn)變其成員變量(非mutalbe成員)2)不能調(diào)用其非const成員函數(shù)1 class AClass 2 public: 3 int m_var; 4 mutable int m_mutable_var; 5
11、 void setVar(int var) m_var = var; 6 void printVar() cout << m_var; 7 void printVar_const()const cout << m_var; 8 ; 9 10 const AClass ac;11 ac.m_var = 20; / Error:ac是一個(gè)const類,不能修改成員變量12 ac.m_mutable_var = 42; / ok 可以修改mutable修飾的變量13 ac.setVar(20); / Error: ac不能調(diào)用非const成員函數(shù),而且這個(gè)成員函數(shù)還修改了成員
12、變量的值14 ac.printVar();/ Error:ac不能調(diào)用非const成員函數(shù)15 ac.printVar_const(); / ok七、const與類的成員1,const成員變量const 成員變量指的是類中的成員變量為只讀,不能夠被修改(包括在類外部和類內(nèi)部)。1)const 成員變量必須在類的構(gòu)造函數(shù)初始化表達(dá)式中被初始化,即使在構(gòu)造函數(shù)體內(nèi)也不行以。2)靜態(tài) const 成員變量需要在類外部單獨(dú)定義并初始化(可定義在頭文件)1 class constTestClass2 3 public:4 const int var;5 static const int sci
13、;6 public:7 constTestClass() :var(42) / const成員變量必須在類的構(gòu)造函數(shù)初始化列表中初始化8 ;9 const int constTestClass:sci = 42; / static const成員變量需要在類外單獨(dú)進(jìn)行定義和初始化類對象的實(shí)例化過程可以理解為包含以下步驟: 首先,開辟整個(gè)類對象的內(nèi)存空間。之后,依據(jù)類成員情況,安排各個(gè)成員變量的內(nèi)存空間,并通過構(gòu)造函數(shù)的初始化列表進(jìn)行初始化。最后,執(zhí)行構(gòu)造函數(shù)中的代 碼。由于 const 成員變量必須在定義(安排內(nèi)存空間)時(shí),就進(jìn)行初始化。所以需要在夠在函數(shù)的初始化列表中初始化。const成員在
14、初始化之后,其值就不允許轉(zhuǎn)變了,即便在構(gòu)造內(nèi)部也是不允許的。靜態(tài)成員變量并不屬于某個(gè)類對象,而是整個(gè)類共有的。靜態(tài)成員變量可以不依附于某個(gè)實(shí)例化后的類對象進(jìn)行訪問。那么,靜態(tài)成員變量的值,應(yīng)該在任何實(shí)例化操作之前,就能夠進(jìn)行轉(zhuǎn)變(否則,只有實(shí)例化至少一個(gè)對象,才能訪問靜態(tài)成員)。所以,靜態(tài)成員變量不能夠由構(gòu)造函數(shù)進(jìn)行內(nèi)存安排,而應(yīng)該在類外部單獨(dú)定義,在實(shí)例化任何對象之前,就開辟好空間。又由于 const 成員變量 必須初始化,所以靜態(tài)成員變量必須在定義的時(shí)候就初始化。2,const成員函數(shù)const成員函數(shù)指的是,此函數(shù)不應(yīng)該修改任何成員變量。1)傳給const成員函數(shù)的this指針,是指向
15、const 對象 的 const 指針。2)const成員函數(shù),不能夠修改任何成員變量,除非成員變量被 mutable 修飾符修飾。1 class constTestClass 2 3 public: 4 int var; 5 const int ci; 6 mutable int mci; 7 public: 8 void setVar(int i); 9 void setMci(int i)const;10 ;11 void constTestClass:setVar(int i)12 13 var = i; / ok14 mci = i; / ok15 ci = i; / Error:c
16、i是一個(gè)const對象不能修改16 17 void constTestClass:setMci(int i)const18 19 var = i; / ok20 mci = i; / ok mutable成員變量可以被const成員函數(shù)修改21 ci = i; / Error22 在成員函數(shù)調(diào)用的過程中,都有一個(gè) this 指針被當(dāng)做參數(shù)隱性地傳遞給成員函數(shù)(可能通過棧,也可能通過CPU寄存器)。這個(gè)this指針,指向調(diào)用這個(gè)函數(shù)的對象(這樣,成員函數(shù)才能找到成員變量的地址,從而對其進(jìn)行操作)。這個(gè)this指針,是個(gè) const指針,不能修改其指向(你不盼望這個(gè)對象的函數(shù),修改了那個(gè)
17、對象的成員變量,對吧?)。傳遞給const成員函數(shù)的this指針,指向一個(gè)const對象。也就是說,在const成員函數(shù)內(nèi)部,這個(gè)this指針是一個(gè)指向const對象的const指針。mutable 修飾符使得const函數(shù)的行為有了一些敏捷性。相當(dāng)于提醒編譯器,這個(gè)成員變量比較特別,就不要進(jìn)行任何只讀檢查了。為什么 const 對象只能夠調(diào)用const成員函數(shù)呢?,其實(shí)是這樣的。由于對象本身通過 const 修飾,那么指向這個(gè)對象的指針也就是指向const對象的const指針了。換句話說,指向這個(gè)對象的this指針就是指向const對象的const指針。一般成員函數(shù)要求的this指針為:指向
18、對象的const指針。所以此處發(fā)生了參數(shù)不匹配,無法進(jìn)行調(diào)用。而 const 成員函數(shù)要求的this指針,恰恰是 指向const對象的const指針。所以依然能夠調(diào)用。八、const與函數(shù)將函數(shù)的形參用const修飾是盼望實(shí)參在函數(shù)內(nèi)部不被修改,而一般函數(shù)接口可能會遇到以下三種情況:1,const對象2,指向const對象的指針3,綁定const對象的引用4,返回值是一個(gè)const對象首先,我們看const對象的形參,這種接口用const修飾實(shí)際上沒有任何意義,由于實(shí)參在傳遞給實(shí)參時(shí)是傳遞了一份副本,原實(shí)參是不會變化的。1 int main(void) 2 3 int var = 42; 4 fun(var); 5 cout << var << endl; / print 42 6 return 0; 7 8 void fun(
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 物理-山東省淄博市濱州市2024-2025學(xué)年度2025屆高三模擬考試(淄博濱州一模)試題和答案
- 院感知識崗前培訓(xùn)課件
- 2025年中考道德與法治全真模擬卷 3套(含答案)
- 夏縣財(cái)稅知識培訓(xùn)課件
- 個(gè)人醫(yī)療合同范例
- 新版PEP小學(xué)五年級英語My-favourite-season-My-favourite-season-教學(xué)設(shè)計(jì)
- 倉儲合同范例案例
- 秘書職業(yè)生涯的長期規(guī)劃計(jì)劃
- 反思與總結(jié)的實(shí)踐計(jì)劃
- 新聞傳播社團(tuán)內(nèi)容創(chuàng)作規(guī)劃計(jì)劃
- 放射科未來五年發(fā)展規(guī)劃(2021-2025)
- 中學(xué)生預(yù)防性侵主題班會
- 不良資產(chǎn)項(xiàng)目律師法律盡調(diào)報(bào)告(模板)
- 2023年人力資源和社會保障部公開招聘工作人員筆試參考題庫(共500題)答案詳解版
- 高級技校電氣自動化設(shè)備安裝與維修教學(xué)計(jì)劃
- 《長征之戰(zhàn)役》課件
- 心電監(jiān)護(hù)操作評分標(biāo)準(zhǔn)
- 保健品概念及分類
- 水土保持監(jiān)理實(shí)施細(xì)則
- 自體血液回收機(jī)使用(精京3000P型)課件
- 非法捕撈水產(chǎn)品罪
評論
0/150
提交評論