版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、6/6請(qǐng)簡(jiǎn)述static,on,iline的定義及用法staic:。函數(shù)體內(nèi)tatc變量的作用范圍為該函數(shù)體,不同于to變量,該變量的內(nèi)存只被分配一次,因此其值在下次調(diào)用時(shí)仍維持上次的值.在模塊內(nèi)的tati全局變量可以被模塊內(nèi)所有函數(shù)訪問,但不能被模塊外其他函數(shù)訪問.在模塊內(nèi)的static函數(shù)只可被這一模塊內(nèi)的其他函數(shù)調(diào)用,這個(gè)函數(shù)的使用范圍被限制在聲明它的模塊內(nèi).在類中的static成員變量屬于整個(gè)類所有,對(duì)類所有對(duì)象只有一份拷貝。在類中的stati成員函數(shù)屬于整個(gè)類所擁有,這個(gè)函數(shù)不接受ti指針,因而只能訪問類的static成員變量.Cont:1、定義常量(1)const修飾變量,以下兩種
2、定義形式在本質(zhì)上是一樣的.它的含義是:const修飾的類型為TPE的變量aue是不可變的.TYPE constValeNam = value;nTYP ValueNam =lu;(2)將cont改為外部連接,作用于擴(kuò)大至全局,編譯時(shí)會(huì)分配內(nèi)存,并且可以不進(jìn)行初始化,僅僅作為聲明,編譯器認(rèn)為在程序其他地方進(jìn)行了定義。xe cost itVlueame = vlue;、指針使用COST(1)指針本身是常量不可變(cha) cnstontnt;co (char*)pContet;(2)指針?biāo)赶虻膬?nèi)容是常量不可變cons (char)pCntent;(chr) ons pContet;(3)兩者都不
3、可變constchar* onst Conten;(4)還有其中區(qū)別方法,沿著號(hào)劃一條線:如果cos位于的左側(cè),則s就是用來修飾指針?biāo)赶虻淖兞?,即指針指向?yàn)槌A?如果cst位于的右側(cè),cost就是修飾指針本身,即指針本身是常量。3、函數(shù)中使用COST(1)cnt修飾函數(shù)參數(shù)a。傳遞過來的參數(shù)在函數(shù)內(nèi)不可以改變(無意義,因?yàn)閍r本身就是形參)vofunctio(constintVr);b。參數(shù)指針?biāo)竷?nèi)容為常量不可變i fncin(n r r);。參數(shù)指針本身為常量不可變(也無意義,因?yàn)閏hr Var也是形參)oid futin(ha ontV);d.參數(shù)為引用,為了增加效率同時(shí)防止修改。修飾
4、引用參數(shù)時(shí):vod functo(cot lassVar);引用參數(shù)在函數(shù)內(nèi)不可以改變oid funtion(ns TYPE Var);/引用參數(shù)在函數(shù)內(nèi)為常量不可變這樣的一個(gè)cons引用傳遞和最普通的函數(shù)按值傳遞的效果是一模一樣的,他禁止對(duì)引用的對(duì)象的一切修改,唯一不同的是按值傳遞會(huì)先建立一個(gè)類對(duì)象的副本,然后傳遞過去,而它直接傳遞地址,所以這種傳遞比按值傳遞更有效.另外只有引用的onst傳遞可以傳遞一個(gè)臨時(shí)對(duì)象,因?yàn)榕R時(shí)對(duì)象都是con屬性,且是不可見的,他短時(shí)間存在一個(gè)局部域中,所以不能使用指針,只有引用的const傳遞能夠捕捉到這個(gè)家伙。()cnt修飾函數(shù)返回值onst修飾函數(shù)返回值其實(shí)
5、用的并不是很多,它的含義和cont修飾普通變量以及指針的含義基本相同.。contit un1()/這個(gè)其實(shí)無意義,因?yàn)閰?shù)返回本身就是賦值。bont * un2()/調(diào)用時(shí)onst t Vle fun(); /我們可以把un2()看作成一個(gè)變量,即指針內(nèi)容不可變。* onstfun3()/調(diào)用時(shí)nt * ont plue = fun2();/我們可以把fun()看作成一個(gè)變量,即指針本身不可變.(一)inine函數(shù)(摘自 HYPRLNK Prime&ie=tf-rc=e_ighten_f” C+ Primr的第三版)在HYPERLIK t” 函數(shù)聲明或定義中函數(shù)返回類型前加上關(guān)鍵字n
6、ine即把min()指定為內(nèi)聯(lián)。 iline in min(it st,int eed) /;iline 函數(shù)對(duì)編譯器而言必須是可見的,以便它能夠在調(diào)用點(diǎn)內(nèi)展開該函數(shù)。與非inlin函數(shù)不同的是,inline函數(shù)必須在調(diào)用該函數(shù)的每個(gè)文本文件中定義。當(dāng)然,對(duì)于同一程序的不同文件,如果inlie函數(shù)出現(xiàn)的話,其定義必須相同。對(duì)于由兩個(gè)文件opue和raw。C構(gòu)成的程序來說,程序員不能定義這樣的min()函數(shù),它在ompteC中指一件事情,而在daw。C中指另外一件事情.如果兩個(gè)定義不相同,程序?qū)?huì)有未定義的行為: 為保證不會(huì)發(fā)生這樣的事情,建議把le函數(shù)的定義放到頭文件中。在每個(gè)調(diào)用該lne函數(shù)
7、的文件中包含該頭文件。這種方法保證對(duì)每個(gè)nline函數(shù)只有一個(gè)定義,且程序員無需復(fù)制代碼,并且不可能在程序的生命期中引起無意的不匹配的事情。(二)HYERLINK 內(nèi)聯(lián)函數(shù)的編程風(fēng)格(摘自高質(zhì)量C+/C 編程指南)關(guān)鍵字nine 必須與函數(shù)定義體放在一起才能使函數(shù)成為內(nèi)聯(lián),僅將inline 放在函數(shù)聲明前面不起任何作用。如下風(fēng)格的函數(shù)Fo 不能成為內(nèi)聯(lián)函數(shù):inievoid o(int x,int y); /inline 僅與函數(shù)聲明放在一起void Fo(in , int y)而如下風(fēng)格的函數(shù)Fo 則成為內(nèi)聯(lián)函數(shù):vod Foo(intx, nt );inine voidFoo(int x,
8、in y)/ inline 與函數(shù)定義體放在一起所以說,inline 是一種“用于實(shí)現(xiàn)的關(guān)鍵字,而不是一種“用于聲明的關(guān)鍵字”.一般地,用戶可以閱讀函數(shù)的聲明,但是看不到函數(shù)的定義.盡管在大多數(shù)教科書中內(nèi)聯(lián)函數(shù)的聲明、定義體前面都加了inline 關(guān)鍵字,但我認(rèn)為line 不應(yīng)該出現(xiàn)在函數(shù)的聲明中。這個(gè)細(xì)節(jié)雖然不會(huì)影響函數(shù)的功能,但是體現(xiàn)了高質(zhì)量C/C 程序設(shè)計(jì)風(fēng)格的一個(gè)基本原則:聲明與定義不可混為一談,用戶沒有必要、也不應(yīng)該知道函數(shù)是否需要內(nèi)聯(lián)。定義在類聲明之中的成員函數(shù)將自動(dòng)地成為內(nèi)聯(lián)函數(shù)例如classA pubi:vFoo(int x, int ) / 自動(dòng)地成為內(nèi)聯(lián)函數(shù)將成員函數(shù)的定義
9、體放在類聲明之中雖然能帶來書寫上的方便,但不是一種良好的編程風(fēng)格,上例應(yīng)該改成:/ 頭文件clas A publi: voidFoo(nt x, nt y);/ 定義文件inlne vo :F(intx, nt )慎用內(nèi)聯(lián)內(nèi)聯(lián)能提高函數(shù)的執(zhí)行效率,為什么不把所有的函數(shù)都定義成內(nèi)聯(lián)函數(shù)?如果所有的函數(shù)都是內(nèi)聯(lián)函數(shù),還用得著“內(nèi)聯(lián)這個(gè)關(guān)鍵字嗎??jī)?nèi)聯(lián)是以代碼膨脹(復(fù)制)為代價(jià),僅僅省去了函數(shù)調(diào)用的開銷,從而提高函數(shù)的執(zhí)行效率。如果執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間,相比于函數(shù)調(diào)用的開銷較大,那么效率的收獲會(huì)很少。另一方面,每一處內(nèi)聯(lián)函數(shù)的調(diào)用都要復(fù)制代碼,將使程序的總代碼量增大,消耗更多的內(nèi)存空間.以下情況不宜
10、使用內(nèi)聯(lián):(1)如果函數(shù)體內(nèi)的代碼比較長(zhǎng),使用內(nèi)聯(lián)將導(dǎo)致內(nèi)存消耗代價(jià)較高。(2)如果函數(shù)體內(nèi)出現(xiàn)循環(huán),那么執(zhí)行函數(shù)體內(nèi)代碼的時(shí)間要比函數(shù)調(diào)用的開銷大。類的構(gòu)造函數(shù)和析構(gòu)函數(shù)容易讓人誤解成使用內(nèi)聯(lián)更有效。要當(dāng)心構(gòu)造函數(shù)和析構(gòu)函數(shù)可能會(huì)隱藏一些行為,如“偷偷地”執(zhí)行了基類或成員對(duì)象的構(gòu)造函數(shù)和析構(gòu)函數(shù)。所以不要隨便地將構(gòu)造函數(shù)和析構(gòu)函數(shù)的定義體放在類聲明中。一個(gè)好的編譯器將會(huì)根據(jù)函數(shù)的定義體,自動(dòng)地取消不值得的內(nèi)聯(lián)(這進(jìn)一步說明了 nlie 不應(yīng)該出現(xiàn)在函數(shù)的聲明中)。注意點(diǎn):內(nèi)聯(lián)函數(shù)既能夠去除函數(shù)調(diào)用所帶來的效率負(fù)擔(dān)又能夠保留一般函數(shù)的優(yōu)點(diǎn)。然而,內(nèi)聯(lián)函數(shù)并不是萬能藥,在一些情況下,它甚至能夠降
11、低程序的性能。因此在使用的時(shí)候應(yīng)該慎重。 HPERLNK” t1我們先來看看內(nèi)聯(lián)函數(shù)給我們帶來的好處:從一個(gè)用戶的角度來看,內(nèi)聯(lián)函數(shù)看起來和普通函數(shù)一樣, 它可以有參數(shù)和返回值,也可以有自己的作用域,然而它卻不會(huì)引入一般函數(shù)調(diào)用所帶來的負(fù)擔(dān)。另外, 它可以比宏更安全更容易調(diào)試. 當(dāng)然有一點(diǎn)應(yīng)該意識(shí)到,inline pecifier僅僅是對(duì)編譯器的建議,編譯器有權(quán)利忽略這個(gè)建議。那么編譯器是如何決定函數(shù)內(nèi)聯(lián)與否呢?一般情況下關(guān)鍵性因素包括函數(shù)體的大小,是否有局部對(duì)象被聲明,函數(shù)的復(fù)雜性等等.2那么如果一個(gè)函數(shù)被聲明為inlie但是卻沒有被內(nèi)聯(lián)將會(huì)發(fā)生什么呢?理論上,當(dāng)編譯器拒絕內(nèi)聯(lián)一個(gè) 函數(shù)的時(shí)
12、候,那個(gè)函數(shù)會(huì)像普通函數(shù)一樣被對(duì)待,但是還會(huì)出現(xiàn)一些其他的問題。例如下面這段代碼: Timehinludect ncludeiostreamus am std; class Tim publ: inline void hw() o (int i 0; i; +)couttim(0)ndl; ; 因?yàn)槌蓡T函數(shù)ime::Show()包括一個(gè)局部變量和一個(gè)for循環(huán),所以編譯器一般拒絕inine,并且把它當(dāng)作一個(gè)普通的成員函數(shù).但是這個(gè)包含類聲明的頭文件會(huì)被單獨(dú)的#nde進(jìn)各個(gè)獨(dú)立的編譯單元中:/ f1.cpp #ncl ”ime” void 1() Tie t1;t。Show(); / 2pp i
13、clude ”ie.h”vof2() Tim 2;t.Shw(); 結(jié)果編譯器為這個(gè)程序生成了兩個(gè)相同成員函數(shù)的拷貝: void (); id f2(); int main() f1(); f();return 0; 當(dāng)程序被鏈接的時(shí)候,linker將會(huì)面對(duì)兩個(gè)相同的Tie:Shw()拷貝,于是函數(shù)重定義的連接錯(cuò)誤發(fā)生.但是老一些的+實(shí)現(xiàn)對(duì)付這種情況的辦法是通過把一個(gè)iline函數(shù)當(dāng)作static來處理。因此每一份函數(shù)拷貝僅僅在自己的編譯單元中可見,這樣鏈接錯(cuò)誤就解決了,但是在程序中卻會(huì)留下多份函數(shù)拷貝。在這種情況下,程序的性能不但沒有提升,反而增加了編譯和鏈接時(shí)間以及最終可執(zhí)行體的大小.但是
14、幸運(yùn)的是,新的C+標(biāo)準(zhǔn)中關(guān)于u-ilined函數(shù)的說法已經(jīng)改變.一個(gè)符合標(biāo)準(zhǔn)C+實(shí)現(xiàn)應(yīng)該只生成一份函數(shù)拷貝。然而,要想所有的編譯器都支持這一點(diǎn)可能還需要很長(zhǎng)時(shí)間。 另外關(guān)于內(nèi)聯(lián)函數(shù)還有兩個(gè)更令人頭疼的問題。第一個(gè)問題是該如何進(jìn)行維護(hù).一個(gè)函數(shù)開始的時(shí)候可能以內(nèi)聯(lián)的形式出現(xiàn),但是隨著系統(tǒng)的擴(kuò)展,函數(shù)體可能要求添加額外的功能,結(jié)果內(nèi)聯(lián)函數(shù)就變得不太可能,因此需要把inlne ecfier去除以及把函數(shù)體放到一個(gè)單獨(dú)的源文件中.另一個(gè)問題是當(dāng)內(nèi)聯(lián)函數(shù)被應(yīng)用在代碼庫(kù)的時(shí)候產(chǎn)生.當(dāng)內(nèi)聯(lián)函數(shù)改變的時(shí)候,用戶必須重新編譯他們的代碼以反映這種改變.然而對(duì)于一個(gè)非內(nèi)聯(lián)函數(shù),用戶僅僅需要重新鏈接就可以了。 這里想要說的是,內(nèi)聯(lián)函數(shù)并不是一個(gè)增強(qiáng)性能的靈丹妙藥.只有當(dāng)函數(shù)非常短小的時(shí)候它才能得到我們想要的效果,但是如果函數(shù)并不是很短而且在很多地方都被調(diào)用的話,那么將會(huì)使得可執(zhí)行體的體積增大。最令人煩惱的還是當(dāng)編譯器拒絕內(nèi)聯(lián)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年忻州道路貨物運(yùn)輸駕駛員考試
- 2025年鶴壁普通貨運(yùn)從業(yè)資格證考試
- 化學(xué)教學(xué)科研課件
- 2025年福建b2考貨運(yùn)資格證要多久
- 2025年天水a(chǎn)2貨運(yùn)從業(yè)資格證模擬考試
- 兒童教育與心理發(fā)展培訓(xùn)
- 托幼機(jī)構(gòu)手足口病防控
- 2025民營(yíng)醫(yī)院的勞動(dòng)合同范文
- 2025銷售人員勞動(dòng)合同
- 2025消防工程施工勞務(wù)合同
- 林木分子標(biāo)記輔助育種
- 學(xué)校護(hù)理實(shí)訓(xùn)室建設(shè)方案
- 《品保QC培訓(xùn)資料》課件
- 《藥物制劑工程》課程教學(xué)大綱全套
- 《觀光園藝》課件
- 2023年創(chuàng)建智慧校園工作總結(jié)
- DL-T 2559-2022 燈泡貫流式水輪機(jī)狀態(tài)檢修評(píng)估技術(shù)導(dǎo)則
- 國(guó)開電大《人文英語3》一平臺(tái)機(jī)考真題(第十三套)
- 承德圍場(chǎng)2023-2024學(xué)年七年級(jí)上學(xué)期期末數(shù)學(xué)精選卷(含答案)
- 數(shù)字化農(nóng)業(yè)的應(yīng)用
- 《財(cái)務(wù)管理》全套課件
評(píng)論
0/150
提交評(píng)論