第6章函數

1. 函數:能夠對數據進行處理並返回一個值的子程序。函數一般有兩種:用戶自定義的,就是你自己寫的;和內置函數,就是別人已經寫好的,供你用的

2. 函數裏面有參數傳遞。也就是比如聲明一個函數int max(int x, int y); 在main函數裏調用max(x,y),在函數max內,不管你怎麼處理x和y的值,在main函數內它都不會改變。那是因爲在調用max時,程序會在另一塊內存創建運行這個函數,main函數內的x y會傳遞給max內的x y。也就是這兩組數據x y是不同的。就好比我們兩家都有一個茶杯一個暖壺。雖然樣式都一樣,但我家的是我家的,我怎麼處理不會影響你家的茶杯和暖壺。

3. 全局變量:如果在程序外面也就是main函數外面聲明定義了變量,這屬於全局變量。在這個程序內任何一個函數都可以使用。但是如果在函數內聲明定義與全局變量一樣的名字,那麼就會使用函數內定義的變量,而會隱藏全局變量。但是不提倡這樣,因爲這樣會讓人感到迷惑,不清楚到底在用哪一個。全局變量也要儘量不要使用,是不提倡的。如果調用的比較多,那麼就會存在隱含的錯誤。

4. 默認參數,在定義函數時,可以爲其定義默認參數,也就是如果你沒有傳遞參數給函數,函數會使用你給的默認參數。但傳遞參數有順序限制。long m_function(int a, int b=3, int c=4); 你必須先傳遞c才能傳遞b,傳遞了c 和 b才能傳遞a。如果你沒有給函數的第二個和第三個參數傳遞參數,那麼就默認爲3 和 4

5. 重載:這是c++很重要的一個概念。與之區別並容易混淆的是重寫,這個後面提到在說。重載就是你可以創建多個名稱相同的函數。這些重名的函數通過其參數列表的不同來區分,就是參數個數或是類型不同。不能通過函數不同的返回值類型來區分。重載也就做多態,就是多種形態

例:

int myf(int, int);

int myf(long, int);

int my(long);

如果寫成 這樣:

int myf(int);

void myf(int);這樣就是錯誤的

這樣的好處是,可以用同一個函數來實現不同類型的同樣功能。比如求和,你可以求整數的和,浮點數的和等等。

6.內聯函數:我們定義的函數,會被單獨與其被調用的函數(主程序)分開,單獨分配一塊內存來創建。如果被調用,程序會從調用處跳轉到函數分配的內存地方執行,執行完後在跳回終端處繼續下面的程序。如果函數很小,那麼可能來回跳轉調用內存的時間會比運行函數所用的時間長。爲了效率,這裏如果想縮減時間,那麼主要就是減少這類小函數的調用時間,這是可以在函數聲明時在前面加上inline,

例:

inline int max(int x, int y);

這時這個函數就會在編譯時被寫到調用此函數的地方,成爲調用函數的一部分,所以函數也就不會被單獨再創建,就會和調用函數一起創建。這樣運行到函數的地方,原來需要跳轉,現在只需繼續執行就可以了,引文它成爲了調用函數的一部分。不過這種做法會到會程序變大。因爲原來如果調用函數,那麼函數只需創建一個副本,然後被其他函數調用。現在這需要在每個調用此函數的地方創建一個副本。這樣如果多了可能會比調用函數更慢。所以如果程序中調用的比較多,最好還是不要聲明成內聯

7.遞歸:就是函數自己調用自己。遞歸可以解決一些比較抽象或是很繁瑣的問題。不過要注意每次遞歸系統都會再重新創建一個副本,直到被返回。所以遞歸不要層次太深,可能會使內存用盡導致出錯。

例:

斐波那契函數 1, 1, 2, 3, 5, 8,就是從第三個開始,每個數等於前兩個相加。

int fib(int n)

{

if(n<3)

{

return(1);

}

else

{

rturn(fib(n-2) + fib(n-1));

}

}

8.函數調用時的基本過程:運行起來後,裏面的代碼會被放到代碼空間內,每句代碼都會被翻譯成一條指令。然後爲程序分配一塊特殊的內存,叫做堆棧。堆棧是先進後出,就是指令是被一條一條的放到堆棧中去的,想讀取只能讀最上面的一條。這時程序運行,當運行到函數調用處時,指令指針會指向下一條指令(程序運行都是這樣,就是指向現在運行指令的下一條指令,把它放入堆棧存儲起來),也就是調用完函數的下一條指令,然後壓入堆棧。緊接着檢測函數的返回類型,如果不是void,那麼就在堆棧再分配返回數據所需要的內存空間大小。然後加載函數的內存地址,這時棧的地址會被存入一個特殊指針棧幀內,用來與調用函數區分。這時被加入數據都被認爲局部數據。被調用函數結束時,返回值會被放到原理預留的地方,被調用函數所加載的數據會被棧不斷彈出知道遇到棧幀,這是把返回值也彈出作爲函數的值回到調用函數內繼續執行下面的命令。因爲被調用函數的所有數據都被棧彈出,所以是局部數據,在調用函數無法訪問了。

下章見(以上全是個人觀點,如有不當,敬請提出)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章