# 成員函數(shù)的聲明和定義:
class Human {public: void set(int) ; //聲明 int PRint() { return weight; }private: int weight;};int main( ) { Human Tom,Mike; Tom.set ( 111 ) ; cout<<"Tom 's weight is:"<<Tom.print()<<"/n"; Mike.set(0); cout<<"Mike 's weight is:"<<Tom.print()<<"/n"; return 0;}void Human::set ( int w) { if ( w>0 || w<100 ) weight = w; else{ cout<<"The weight should be 0~100,otherwise we'll set it 0 /n"; weight = 0; }}為什么非要將成員函數(shù)的聲明和定義分開?直接使用合并的成員函數(shù)豈不是更加間接和方便呢?
于是我們要了解 內(nèi)聯(lián)函數(shù):
l 內(nèi)聯(lián)函數(shù)
引入內(nèi)聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調(diào)用的效率問題。 函數(shù)調(diào)用會(huì)帶來降低效率的問題,因?yàn)檎{(diào)用函數(shù)實(shí)際上將程序執(zhí)行順序轉(zhuǎn)移到函數(shù)所存放在內(nèi)存中某個(gè)地址,
將函數(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í)間和空間方面的開銷,于是將影響其效率。特別是對于一些函數(shù)體代碼不是很大,
但又頻繁地被調(diào)用的函數(shù)來講,解決其效率問題更為重要。通俗地說:當(dāng)我們定義了一個(gè)函數(shù)以后,
編譯器就會(huì)在內(nèi)存中為其創(chuàng)建一個(gè)指令集,當(dāng)調(diào)用此函數(shù)時(shí),程序就會(huì)跳轉(zhuǎn)到該指令集處,
若是對函數(shù)執(zhí)行上百次調(diào)用,那么就要來回跳轉(zhuǎn)上百次,這會(huì)嚴(yán)重影響到程序的執(zhí)行效率,
引入內(nèi)聯(lián)函數(shù)實(shí)際上就是為了解決這一問題。 在程序編譯時(shí),編譯器將程序中出現(xiàn)的內(nèi)聯(lián)函數(shù)的調(diào)用表達(dá)式用內(nèi)聯(lián)函數(shù)的函數(shù)體來進(jìn)行替換。
顯然,這種做法不會(huì)產(chǎn)生轉(zhuǎn)去轉(zhuǎn)回的問題,但是由于在編譯時(shí)將函數(shù)休中的代碼被替代到程序中,
因此會(huì)增加目標(biāo)程序代碼量,進(jìn)而增加空間開銷。
內(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;
}
編譯器不會(huì)創(chuàng)建真正的函數(shù),而只是將這個(gè)內(nèi)聯(lián)函數(shù)的所有代碼復(fù)制到調(diào)用函數(shù)中,
這樣程序在執(zhí)行調(diào)用該函數(shù)時(shí)就不需要來回跳轉(zhuǎn),效率自然提高了,但是由于復(fù)制多次,
也導(dǎo)致了程序的體積增大,所以當(dāng)在函數(shù)體很小時(shí),適宜使用內(nèi)聯(lián)函數(shù)。
# 成員函數(shù)的聲明和定義:
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注