欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

內(nèi)聯(lián)函數(shù)以及兩種傳值方式的比較

系統(tǒng) 2076 0

內(nèi)聯(lián)函數(shù)以及兩種傳值方式的比較 - lidoublewen的專欄 - 博客頻道 - CSDN.NET

內(nèi)聯(lián)函數(shù)以及兩種傳值方式的比較

155人閱讀 評論 (0) 收藏 舉報(bào)

今天去參加UCweb的筆試,呵呵,里面涉及了一些c++的基礎(chǔ)知識,原來自己還有些知識是很模糊的,回來查了一下。。。為下次筆試做好準(zhǔn)備。

?一.關(guān)于內(nèi)聯(lián)函數(shù): 引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問題。

?

函數(shù)是一種更高級的抽象。它的引入使得編程者只關(guān)心函數(shù)的功能和使用方法,而不必關(guān)心函數(shù)功能的具體實(shí)現(xiàn);函數(shù)的引入可以減少程序的目標(biāo)代碼,實(shí)現(xiàn)程序代碼和數(shù)據(jù)的共享。但是,函數(shù)調(diào)用也會帶來降低效率的問題,因?yàn)檎{(diào)用函數(shù)實(shí)際上將程序執(zhí)行順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中某個地址,將函數(shù)的程序內(nèi)容執(zhí)行完后,再返回到轉(zhuǎn)去執(zhí)行該函數(shù)前的地方。這種轉(zhuǎn)移操作要求在轉(zhuǎn)去前要保護(hù)現(xiàn)場并記憶執(zhí)行的地址,轉(zhuǎn)回后先要恢復(fù)現(xiàn)場,并按原來保存地址繼續(xù)執(zhí)行。因此,函數(shù)調(diào)用要有一定的時間和空間方面的開銷,于是將影響其效率。特別是對于一些函數(shù)體代碼不是很大,但又頻繁地被調(diào)用的函數(shù)來講,解決其效率問題更為重要。引入內(nèi)聯(lián)函數(shù)實(shí)際上就是為了解決這一問題。

?

在程序編譯時,編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進(jìn)行替換。顯然,這種做法不會產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回的問題,但是由于在編譯時將函數(shù)休中的代碼被替代到程序中,因此會增加目標(biāo)程序代碼量,進(jìn)而增加空間開銷,而在時間代銷上不象函數(shù)調(diào)用時那么大,可見它是以目標(biāo)代碼的增加為代價(jià)來換取時間的節(jié)省。

內(nèi)聯(lián)函數(shù)的定義方法

定義內(nèi)聯(lián)函數(shù)的方法很簡單,只要在函數(shù)定義的頭前加上關(guān)鍵字inline即可。內(nèi)聯(lián)函數(shù)的定義方法與一般函數(shù)一樣。如:   inline int add_int (int x, int y, int z)   {   return x+y+z;   }

?

在程序中,調(diào)用其函數(shù)時,該函數(shù)在編譯時被替代,而不是像一般函數(shù)那樣是在運(yùn)行時被調(diào)用。

使用內(nèi)聯(lián)函數(shù)應(yīng)注意的事項(xiàng)

內(nèi)聯(lián)函數(shù)具有一般函數(shù)的特性,它與一般函數(shù)所不同之處公在于函數(shù)調(diào)用的處理。一般函數(shù)進(jìn)行調(diào)用時,要將程序執(zhí)行權(quán)轉(zhuǎn)到被調(diào)用函數(shù)中,然后再返回到調(diào)用它的函數(shù)中;而內(nèi)聯(lián)函數(shù)在調(diào)用時,是將調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)體來替換。

在使用內(nèi)聯(lián)函數(shù)時,應(yīng)注意如下幾點(diǎn):

1.類內(nèi)定義的函數(shù)是內(nèi)聯(lián)函數(shù),類外定義的函數(shù)是非內(nèi)聯(lián)函數(shù)(短函數(shù)可以定義在類內(nèi),長函數(shù)可以定義在類外)。

2.可以為類外定義的函數(shù)指定 inline 關(guān)鍵字,強(qiáng)行為內(nèi)聯(lián)函數(shù)。

3.在內(nèi)聯(lián)函數(shù)內(nèi)不允許用循環(huán)語句和開關(guān)語句。

4.內(nèi)聯(lián)函數(shù)的定義必須出現(xiàn)在內(nèi)聯(lián)函數(shù)第一次被調(diào)用之前。

?

二.引用傳遞與指針傳遞的比較 a.比較一 引用是C++中的概念,初學(xué)者容易把引用和指針混淆一起。 一下程序中,n是m的一個引用(reference),m是被引用物(referent)。 int m; int &n = m; n相當(dāng)于m的別名(綽號),對n的任何操作就是對m的操作。 所以n既不是m的拷貝,也不是指向m的指針,其實(shí)n就是m它自己。 引用的規(guī)則:

(1)引用被創(chuàng)建的同時必須被初始化(指針則可以在任何時候被初始化)。

(2)不能有NULL引用,引用必須與合法的存儲單元關(guān)聯(lián)(指針則可以是NULL)。

?(3)一旦引用被初始化,就不能改變引用的關(guān)系(指針則可以隨時改變所指的對象)。

以下示例程序中,k被初始化為i的引用。 語句k = j并不能將k修改成為j的引用,只是把k的值改變成為6。 由于k是i的引用,所以i的值也變成了6。 int i = 5; int j = 6; int &k = i; k = j; // k和i的值都變成了6; 引用的主要功能是傳遞函數(shù)的參數(shù)和返回值。 C++語言中,函數(shù)的參數(shù)和返回值的傳遞方式有三種:值傳遞、指針傳遞和引用傳遞。

?

以下是"值傳遞"的示例程序。 由于Func1函數(shù)體內(nèi)的x是外部變量n的一份拷貝,改變x的值不會影響n, 所以n的值仍然是0。 void Func1(int x) { x = x + 10; } ... int n = 0; Func1(n); cout << "n = " << n << endl; // n = 0 以下是"指針傳遞"的示例程序。 由于Func2函數(shù)體內(nèi)的x是指向外部變量n的指針,改變該指針的內(nèi)容將導(dǎo)致n的值改變,所以n的值成為10。

void Func2(int *x) { (* x) = (* x) + 10; } ... int n = 0; Func2(&n); cout << "n = " << n << endl; // n = 10

?

以下是"引用傳遞"的示例程序。

由于Func3函數(shù)體內(nèi)的x是外部變量n的引用,x和n是同一個東西,改變x等于改變n,所以n的值成為10。

void Func3(int &x) { x = x + 10; } ... int n = 0; Func3(n); cout << "n = " << n << endl; // n = 10

?

對比上述三個示例程序,會發(fā)現(xiàn)"引用傳遞"的性質(zhì)象"指針傳遞",而書寫方式象"值傳遞"。 實(shí)際上"引用"可以做的任何事情"指針"也都能夠做,為什么還要"引用"這東西? 答案是"用適當(dāng)?shù)墓ぞ咦銮∪缙浞值墓ぷ?。 指針能夠毫無約束地操作內(nèi)存中的任何東西,盡管指針功能強(qiáng)大,但是非常危險(xiǎn)。 如果的確只需要借用一下某個對象的"別名",那么就用"引用",而不要用"指針",以免發(fā)生意外。 引用就是傳遞的原始變量,指針傳遞的是變量的地址,兩者沒什么關(guān)系, 引用主要用于函數(shù)參數(shù)的傳遞,相對于傳值,可以節(jié)省內(nèi)存空間, 指針可以直接傳遞變量地址,也可以可以節(jié)省內(nèi)存空間,但是指針功能強(qiáng)大一些,可以在自由操作數(shù)組變量。

?

b.比較二

(1)非空區(qū)別。在任何情況下都不能使用指向空值的引用。一個引用必須總是指向某些對象。因此如果你使用一個變量并讓他指向一個對象,但是該變量在某些時候也可能不指向任何對象,這是你應(yīng)該把變量聲明為指針,因?yàn)檫@樣你可以賦予空值給該變量。相反,如果變量肯定指向一個對象,例如你的設(shè)計(jì)不允許變量為空,這時你就可以把變量聲明為引用。不存在指向空值得引用這個事實(shí)意味著使用引用的代碼效率比使用指針要高。

(2)合法性區(qū)別。在使用引用之前不需要測試它的合法性。相反,指針則應(yīng)該總是被測試,防止其為空。

(3)可修改區(qū)別。指針與引用的另一個重要的不同是指針可以被重新賦值以指向另一個不同的對象。但是引用則是總是指向在初始化時被指定的對象,以后不能改變,但是指定的對象其內(nèi)容可以改變。

(4)應(yīng)用區(qū)別。總的來說,在以下情況下你應(yīng)該使用指針:一是你考慮到存在不指向任何對象對象的可能(在這種情況下,你能夠設(shè)置指針為空),二是你需要能夠在不同的時刻指向不同的對象(在這種情況下,你能改變指針的指向)。如果總是指向一個對象并且一旦指向一個對象后就不會改變指向,那么你應(yīng)該使用引用。 三.char* a=0? 原來以為這個是非法的賦值,查了下百度,原來char* a = 0就是char* a = NULL的意思~~

內(nèi)聯(lián)函數(shù)以及兩種傳值方式的比較


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 欧美成人私人视频88在线观看 | 日韩一区二区三区视频 | 久草视频福利在线观看 | 九草在线视频 | 嫩草电影院| 亚洲一区二区三区在线视频 | 爱婷婷网站在线观看 | 午夜精品久久久 | 精品久久久久久国产 | 不卡一区 | 欧美日本中文字幕 | 日韩精品 电影一区 亚洲 | 三级三级三级a三级三级 | 欧美日韩一区二区三区免费视频 | 国产3级在线观看 | 成人a网 | 99精品国产福利在线观看 | 亚洲成人精品久久 | 999热在线视频 | 青青青青手机在线视频观看国产 | 日韩三级伦理在线 | 2014亚洲天堂 | 最新日本中文字幕在线观看 | 国产色婷婷亚洲99精品小说 | 首页亚洲国产丝袜长腿综合 | 日本午夜在线观看 | 国产精品亚洲片在线va | 久久综合久久综合久久综合 | 精品欧美乱码久久久久久 | 天天色天天干天天 | 深夜电影网| 四虎新网站| 成人免费视频观看 | 久久久久综合 | 波多野结衣办公室33分jian情 | 国产精品一区二区三区免费 | 91看片片| 亚洲一级免费视频 | 综合电影网 | 四虎4hu | 色婷婷久久免费网站 |