# 成員函數(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ù)豈不是更加間接和方便呢?
于是我們要了解 內聯(lián)函數(shù):
l 內聯(lián)函數(shù)
引入內聯(lián)函數(shù)的目的是為了解決程序中函數(shù)調用的效率問題。 函數(shù)調用會帶來降低效率的問題,因為調用函數(shù)實際上將程序執(zhí)行順序轉移到函數(shù)所存放在內存中某個地址,
將函數(shù)的程序內容執(zhí)行完后,再返回到轉去執(zhí)行該函數(shù)前的地方。
這種轉移操作要求在轉去前要保護現(xiàn)場并記憶執(zhí)行的地址,轉回后先要恢復現(xiàn)場,并按原來保存地址繼續(xù)執(zhí)行。
因此,函數(shù)調用要有一定的時間和空間方面的開銷,于是將影響其效率。特別是對于一些函數(shù)體代碼不是很大,
但又頻繁地被調用的函數(shù)來講,解決其效率問題更為重要。通俗地說:當我們定義了一個函數(shù)以后,
編譯器就會在內存中為其創(chuàng)建一個指令集,當調用此函數(shù)時,程序就會跳轉到該指令集處,
若是對函數(shù)執(zhí)行上百次調用,那么就要來回跳轉上百次,這會嚴重影響到程序的執(zhí)行效率,
引入內聯(lián)函數(shù)實際上就是為了解決這一問題。 在程序編譯時,編譯器將程序中出現(xiàn)的內聯(lián)函數(shù)的調用表達式用內聯(lián)函數(shù)的函數(shù)體來進行替換。
顯然,這種做法不會產(chǎn)生轉去轉回的問題,但是由于在編譯時將函數(shù)休中的代碼被替代到程序中,
因此會增加目標程序代碼量,進而增加空間開銷。
內聯(lián)函數(shù)的定義方法
定義內聯(lián)函數(shù)的方法很簡單,只要在函數(shù)定義的頭前加上關鍵字inline即可。
內聯(lián)函數(shù)的定義方法與一般函數(shù)一樣。
如:
inline int add_int (int x, int y, int z) {
return x+y+z;
}
編譯器不會創(chuàng)建真正的函數(shù),而只是將這個內聯(lián)函數(shù)的所有代碼復制到調用函數(shù)中,
這樣程序在執(zhí)行調用該函數(shù)時就不需要來回跳轉,效率自然提高了,但是由于復制多次,
也導致了程序的體積增大,所以當在函數(shù)體很小時,適宜使用內聯(lián)函數(shù)。
# 成員函數(shù)的聲明和定義:
新聞熱點
疑難解答