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